


Cara menggunakan Spring AOP untuk melaksanakan pengesahan antara muka dalam SpringBoot
Pengaturcaraan berorientasikan aspek
Pengaturcaraan berorientasikan aspek boleh mengekstrak logik yang tiada kaitan dengan perniagaan tetapi perlu dipanggil bersama oleh pelbagai modul perniagaan, dan memotongnya ke dalam kod dalam bentuk aspek , dengan itu mengurangkan gandingan kod dalam darjah sistem, mengurangkan kod pendua.
Spring AOP melaksanakan pengaturcaraan berorientasikan aspek melalui prakompilasi dan proksi dinamik semasa masa jalan
Pelaksanaan prinsip asas AOP
Penggunaan asas dinamik AOP Proksi selesai keperluan dan menjana kelas proksi untuk kelas yang perlu dipertingkatkan Terdapat dua cara untuk menjana kelas proksi (iaitu kelas yang perlu dipertingkatkan), jika:
- melaksanakan antara muka dan menggunakan proksi dinamik JDK Kelas proksi yang dijana akan menggunakan antara mukanya Jika ia tidak melaksanakan antara muka,
- menggunakan CGlib. proksi dinamik dan kelas proksi yang dijana akan menggunakannya
Titik sambungan: Dalam Kaedah kelas proksi (dipertingkatkan)
Titik masuk: Kaedah yang sebenarnya perlu dipertingkatkan
Pemberitahuan: Kod logik untuk dipertingkatkan
Pra-pemberitahuan: Dilaksanakan sebelum fungsi utama dilaksanakan
Pemberitahuan siaran: Dilaksanakan selepas pelaksanaan fungsi utama
Pemberitahuan keliling: Dilaksanakan sebelum dan selepas pelaksanaan fungsi utama
Pemberitahuan pengecualian: Dilaksanakan apabila pengecualian berlaku dalam pelaksanaan fungsi tema
Pemberitahuan akhir: Fungsi utama akan dilaksanakan tanpa mengira sama ada pelaksanaan berjaya
Aspek: Gabungan titik masuk dan aspek , iaitu kaedah yang dipertingkatkan dan fungsi yang dipertingkatkan membentuk aspek
Anotasi:
@Aspect: Isytiharkan bahawa kelas ialah aspek , tulis pemberitahuan dan titik masuk
@Sebelum: Sesuai pra-pemberitahuan
@AfterReturning: Sesuai dengan post-notification
@Sekitar: Sepadan dengan pemberitahuan sekeliling
@AfterThrowing: Pemberitahuan pengecualian sepadan
@Selepas: Surat pemberitahuan akhir
@Pointcut: Pointcut Penyata, menandakannya pada kaedah boleh menjadikan ungkapan lebih ringkas
Gunakan ungkapan pointcut untuk mengisytiharkan pointcut
- execution([permission modifier][return type][full class path].[nama kaedah][parameter list type] )
Konfigurasikan akaun pengesahan antara muka2 Baca konfigurasi akaunaccount: infos: - account: xinchao secret: adminSalin selepas log masuk
@Data
public class SecretInfo {
private String account;
private String secret;
}
Salin selepas log masuk
3. Tulis kaedah pengesahan antara muka@Data public class SecretInfo { private String account; private String secret; }
@Configuration
@ConfigurationProperties("account")
public class SecretConfig {
private List<SecretInfo> infos;
private Map<String, SecretInfo> map;
private Map<String, TokenInfo> tokenMap = new HashMap<>();
public void setInfos(List<SecretInfo> infos) {
this.infos = infos;
map = infos.stream().collect(Collectors.toMap(SecretInfo::getAccount, Function.identity()));
}
public synchronized String getToken(String account, String secret) {
SecretInfo info = map.get(account);
if (info == null) {
throw new BusinessException("无效账号");
}
if (!StringUtils.equals(info.getSecret(), secret)) {
throw new BusinessException("无效密码");
}
TokenInfo tokenInfo = tokenMap.get(account);
if (tokenInfo != null && tokenInfo.getToken() != null) {
return tokenInfo.getToken();
}
tokenInfo = new TokenInfo();
String uuid = UUID.randomUUID().toString();
tokenInfo.setToken(uuid);
tokenInfo.setCreateDate(LocalDateTime.now());
tokenInfo.setExpireDate(LocalDateTime.now().plusHours(2));
tokenMap.put(account,tokenInfo);
return tokenInfo.getToken();
}
public boolean checkCaptcha(String captcha) {
return tokenMap.values().stream().anyMatch(e->StringUtils.equals(e.getToken(),captcha));
}
}
Salin selepas log masuk@Data
public class TokenInfo {
private LocalDateTime createDate;
private LocalDateTime expireDate;
private String token;
public String getToken() {
if (LocalDateTime.now().isBefore(expireDate)) {
return token;
}
return null;
}
public boolean verification(String token) {
return Objects.equals(this.token, token);
}
}
Salin selepas log masuk
4. Tulis AOP@Configuration @ConfigurationProperties("account") public class SecretConfig { private List<SecretInfo> infos; private Map<String, SecretInfo> map; private Map<String, TokenInfo> tokenMap = new HashMap<>(); public void setInfos(List<SecretInfo> infos) { this.infos = infos; map = infos.stream().collect(Collectors.toMap(SecretInfo::getAccount, Function.identity())); } public synchronized String getToken(String account, String secret) { SecretInfo info = map.get(account); if (info == null) { throw new BusinessException("无效账号"); } if (!StringUtils.equals(info.getSecret(), secret)) { throw new BusinessException("无效密码"); } TokenInfo tokenInfo = tokenMap.get(account); if (tokenInfo != null && tokenInfo.getToken() != null) { return tokenInfo.getToken(); } tokenInfo = new TokenInfo(); String uuid = UUID.randomUUID().toString(); tokenInfo.setToken(uuid); tokenInfo.setCreateDate(LocalDateTime.now()); tokenInfo.setExpireDate(LocalDateTime.now().plusHours(2)); tokenMap.put(account,tokenInfo); return tokenInfo.getToken(); } public boolean checkCaptcha(String captcha) { return tokenMap.values().stream().anyMatch(e->StringUtils.equals(e.getToken(),captcha)); } }
@Data public class TokenInfo { private LocalDateTime createDate; private LocalDateTime expireDate; private String token; public String getToken() { if (LocalDateTime.now().isBefore(expireDate)) { return token; } return null; } public boolean verification(String token) { return Objects.equals(this.token, token); } }
Mula-mula, tulis anotasi untuk menunjukkan bahawa pengesahan tidak diperlukan5 >Gunakan antara muka ini untuk mencipta token dalam ingatan dan mengembalikannya ke bahagian hadapan. Kemudian, kita boleh menghantar token ini untuk pengesahan apabila melaraskan antara muka lain. Kedudukan masuk ialah medan captcha@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CaptchaIgnoreAop { }Salin selepas log masuk@Slf4j @Aspect @Component @Order(2) public class CaptchaAop { @Value("${spring.profiles.active:dev}") private String env; @Autowired private SecretConfig config; @Pointcut("execution(public * com.herenit.phsswitch.controller.impl..*.*(..))" + "&&@annotation(org.springframework.web.bind.annotation.PostMapping)" + "&&!@annotation(com.herenit.phsswitch.aop.CaptchaIgnoreAop)") public void tokenAop() { } @Around("tokenAop()") public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args = joinPoint.getArgs(); if (args.length == 0 || !(args[0] instanceof RequestWrapper) || "test,dev".contains(env)) { log.info("当前环境无需校验token"); return joinPoint.proceed(); } String captcha = ((RequestWrapper) joinPoint.getArgs()[0]).getCaptcha(); if (!config.checkCaptcha(captcha)) { throw new BusinessException("captcha无效"); } return joinPoint.proceed(); } }Salin selepas log masuk
@PostMapping("/login")
@CaptchaIgnoreAop
public ResponseWrapper login(@RequestBody JSONObject userInfo) {
String token = config.getToken(userInfo.getString("loginName")
, userInfo.getString("password"));
JSONObject result = new JSONObject();
result.put("platformAccessToken", token);
return ResponseWrapper.success(result);
}
Salin selepas log masuk
@PostMapping("/login") @CaptchaIgnoreAop public ResponseWrapper login(@RequestBody JSONObject userInfo) { String token = config.getToken(userInfo.getString("loginName") , userInfo.getString("password")); JSONObject result = new JSONObject(); result.put("platformAccessToken", token); return ResponseWrapper.success(result); }
Atas ialah kandungan terperinci Cara menggunakan Spring AOP untuk melaksanakan pengesahan antara muka dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Pada tahun 2023, teknologi AI telah menjadi topik hangat dan memberi impak besar kepada pelbagai industri, terutamanya dalam bidang pengaturcaraan. Orang ramai semakin menyedari kepentingan teknologi AI, dan komuniti Spring tidak terkecuali. Dengan kemajuan berterusan teknologi GenAI (General Artificial Intelligence), ia menjadi penting dan mendesak untuk memudahkan penciptaan aplikasi dengan fungsi AI. Dengan latar belakang ini, "SpringAI" muncul, bertujuan untuk memudahkan proses membangunkan aplikasi berfungsi AI, menjadikannya mudah dan intuitif serta mengelakkan kerumitan yang tidak perlu. Melalui "SpringAI", pembangun boleh membina aplikasi dengan lebih mudah dengan fungsi AI, menjadikannya lebih mudah untuk digunakan dan dikendalikan.

Sebagai peneraju industri, Spring+AI menyediakan penyelesaian terkemuka untuk pelbagai industri melalui API yang berkuasa, fleksibel dan fungsi lanjutannya. Dalam topik ini, kami akan menyelidiki contoh aplikasi Spring+AI dalam pelbagai bidang Setiap kes akan menunjukkan cara Spring+AI memenuhi keperluan khusus, mencapai matlamat dan meluaskan LESSONSLEARNED ini kepada rangkaian aplikasi yang lebih luas. Saya harap topik ini dapat memberi inspirasi kepada anda untuk memahami dan menggunakan kemungkinan Spring+AI yang tidak terhingga dengan lebih mendalam. Rangka kerja Spring mempunyai sejarah lebih daripada 20 tahun dalam bidang pembangunan perisian, dan sudah 10 tahun sejak versi Spring Boot 1.0 dikeluarkan. Sekarang, tiada siapa boleh mempertikaikan Spring itu

Cara melaksanakan transaksi terprogram musim bunga: 1. Gunakan TransactionTemplate 2. Gunakan TransactionCallback dan TransactionCallbackWithoutResult 3. Gunakan anotasi Transaksional;

SpringBoot dan SpringMVC adalah kedua-dua rangka kerja yang biasa digunakan dalam pembangunan Java, tetapi terdapat beberapa perbezaan yang jelas antara mereka. Artikel ini akan meneroka ciri dan penggunaan kedua-dua rangka kerja ini dan membandingkan perbezaannya. Mula-mula, mari belajar tentang SpringBoot. SpringBoot telah dibangunkan oleh pasukan Pivotal untuk memudahkan penciptaan dan penggunaan aplikasi berdasarkan rangka kerja Spring. Ia menyediakan cara yang pantas dan ringan untuk membina bersendirian, boleh dilaksanakan

Artikel ini akan menulis contoh terperinci untuk bercakap tentang perkembangan sebenar dubbo+nacos+Spring Boot. Artikel ini tidak akan merangkumi terlalu banyak pengetahuan teori, tetapi akan menulis contoh paling mudah untuk menggambarkan bagaimana dubbo boleh disepadukan dengan nacos untuk membina persekitaran pembangunan dengan cepat.

Cara menetapkan tahap pengasingan transaksi dalam Spring: 1. Gunakan anotasi @Transactional 2. Tetapkan dalam fail konfigurasi Spring 3. Gunakan PlatformTransactionManager 4. Tetapkan dalam kelas konfigurasi Java. Pengenalan terperinci: 1. Gunakan anotasi @Transactional, tambah anotasi @Transactional pada kelas atau kaedah yang memerlukan pengurusan transaksi dan tetapkan tahap pengasingan dalam atribut 2. Dalam fail konfigurasi Spring, dsb.

Spring ialah rangka kerja sumber terbuka yang menyediakan banyak anotasi untuk memudahkan dan meningkatkan pembangunan Java. Artikel ini akan menerangkan anotasi Spring yang biasa digunakan secara terperinci dan memberikan contoh kod khusus. @Autowired: Autowired @Autowired anotasi boleh digunakan untuk wayar secara automatik dalam bekas Spring. Apabila kami menggunakan anotasi @Autowired di mana kebergantungan diperlukan, Spring akan mencari kacang yang sepadan dalam bekas dan menyuntiknya secara automatik. Kod sampel adalah seperti berikut: @Auto

Apakah perbezaan antara SpringBoot dan SpringMVC? SpringBoot dan SpringMVC ialah dua rangka kerja pembangunan Java yang sangat popular untuk membina aplikasi web. Walaupun mereka sering digunakan secara berasingan, perbezaan antara mereka adalah jelas. Pertama sekali, SpringBoot boleh dianggap sebagai lanjutan atau versi dipertingkatkan bagi rangka kerja Spring. Ia direka bentuk untuk memudahkan proses permulaan dan konfigurasi aplikasi Spring untuk membantu pembangun
