Jadual Kandungan
Pengaturcaraan berorientasikan aspek
Pelaksanaan prinsip asas AOP
Rumah Java javaTutorial Cara menggunakan Spring AOP untuk melaksanakan pengesahan antara muka dalam SpringBoot

Cara menggunakan Spring AOP untuk melaksanakan pengesahan antara muka dalam SpringBoot

May 19, 2023 pm 06:13 PM
spring aop 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

istilah berkaitan AOP

  • 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

Ulasan dan ungkapan titik potong yang berkaitan

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] )

pelaksanaan(* com.xxx.ABC. add()), tingkatkan kaedah kelas ABC

Laksanakan pengesahan antara muka

1. Konfigurasikan fail yml

Konfigurasikan akaun pengesahan antara muka

account:
  infos:
    - account: xinchao
      secret: admin
Salin selepas log masuk
2 Baca konfigurasi akaun

@Data
public class SecretInfo {
    private String account;
    private String secret;
}
Salin selepas log masuk

3. Tulis kaedah pengesahan antara muka

@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

Mula-mula, tulis anotasi untuk menunjukkan bahawa pengesahan tidak diperlukan

@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
5 >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

@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

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Paradigma pengaturcaraan baharu, apabila Spring Boot bertemu OpenAI Paradigma pengaturcaraan baharu, apabila Spring Boot bertemu OpenAI Feb 01, 2024 pm 09:18 PM

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.

Gunakan Spring Boot dan Spring AI untuk membina aplikasi kecerdasan buatan generatif Gunakan Spring Boot dan Spring AI untuk membina aplikasi kecerdasan buatan generatif Apr 28, 2024 am 11:46 AM

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

Apakah kaedah pelaksanaan transaksi program musim bunga? Apakah kaedah pelaksanaan transaksi program musim bunga? Jan 08, 2024 am 10:23 AM

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

Analisis perbandingan dan perbezaan antara SpringBoot dan SpringMVC Analisis perbandingan dan perbezaan antara SpringBoot dan SpringMVC Dec 29, 2023 am 11:02 AM

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

Tutorial praktikal pembangunan SpringBoot+Dubbo+Nacos Tutorial praktikal pembangunan SpringBoot+Dubbo+Nacos Aug 15, 2023 pm 04:49 PM

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 Cara menetapkan tahap pengasingan transaksi dalam Spring Jan 26, 2024 pm 05:38 PM

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.

Anotasi Musim Bunga Didedahkan: Analisis Anotasi Biasa Anotasi Musim Bunga Didedahkan: Analisis Anotasi Biasa Dec 30, 2023 am 11:28 AM

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? Apakah perbezaan antara SpringBoot dan SpringMVC? Dec 29, 2023 am 10:46 AM

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

See all articles