国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot統(tǒng)一處理功能——攔截器

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot統(tǒng)一處理功能——攔截器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.用戶登錄權(quán)限校驗(yàn)

?戶登錄權(quán)限的發(fā)展從之前每個(gè)?法中??驗(yàn)證?戶登錄權(quán)限,到現(xiàn)在統(tǒng)?的?戶登錄驗(yàn)證處理,它是?個(gè)逐漸完善和逐漸優(yōu)化的過(guò)程。

1.1最初用戶登錄

我們先來(lái)回顧?下最初?戶登錄驗(yàn)證的實(shí)現(xiàn)?法:
@RestController
@RequestMapping("/user2")
public class User2Controller {
    /**
     * 
     * 某方法1
     */
    @RequestMapping("/m")
    public Object method(HttpServletRequest request){
        //有session就獲取,沒(méi)有不會(huì)創(chuàng)建
        HttpSession session=request.getSession(false);
        if(session!=null&&session.getAttribute("userinfo")!=null){
            //說(shuō)明已經(jīng)登錄,業(yè)務(wù)處理
            return true;
        }else {
            return false;
        }
    }

    /**
     *某方法2
     */
    @RequestMapping("/m2")
    public Object method2(HttpServletRequest request){
        HttpSession session=request.getSession(false);
        if(session!=null&&session.getAttribute("userinfo")!=null){
            return true;
        }else {
            return false;
        }
    }

}
從上述代碼可以看出,每個(gè)?法中都有相同的?戶登錄驗(yàn)證權(quán)限,它的缺點(diǎn)是:
1. 每個(gè)?法中都要單獨(dú)寫(xiě)?戶登錄驗(yàn)證的?法,即使封裝成公共?法,也?樣要傳參調(diào)?和在?法中進(jìn)?判斷。
2. 添加控制器越多,調(diào)??戶登錄驗(yàn)證的?法也越多,這樣就增加了后期的修改成本和維護(hù)成本。
3. 這些?戶登錄驗(yàn)證的?法和接下來(lái)要實(shí)現(xiàn)的業(yè)務(wù)?何沒(méi)有任何關(guān)聯(lián),但每個(gè)?法中都要寫(xiě)?遍。
所以提供?個(gè)公共的 AOP ?法來(lái)進(jìn)?統(tǒng)?的?戶登錄權(quán)限驗(yàn)證迫在眉睫。

2Spring AOP用戶統(tǒng)一登錄驗(yàn)證的問(wèn)題

說(shuō)到統(tǒng)?的?戶登錄驗(yàn)證,我們想到的第?個(gè)實(shí)現(xiàn)?案是 Spring AOP 前置通知或環(huán)繞通知來(lái)實(shí)現(xiàn),具體實(shí)現(xiàn)代碼如下:
@Slf4j
@Aspect//定義了一個(gè)切點(diǎn)
@Component  //演示統(tǒng)一功能,先去掉
public class LoginAspect {
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object oj=null;
        long start=System.currentTimeMillis();
        //調(diào)用目標(biāo)方法
        try {
            //執(zhí)行連接點(diǎn)的方法
            oj = joinPoint.proceed();
        } catch (Throwable e) {
            throw e;
        }
        log.info(joinPoint.getSignature().toString()+"耗時(shí):"(System.currentTimeMillis()-start));
        //必須要寫(xiě)返回結(jié)果
        return oj;
    }

    @Before("execution(* com.example.springaopdemo.controller.TestController.* (..))")
    public void before2(){
        log.info("before");
    }
}
如果要在以上 Spring AOP 的切?中實(shí)現(xiàn)?戶登錄權(quán)限效驗(yàn)的功能,有以下兩個(gè)問(wèn)題:
1. 沒(méi)辦法獲取到 HttpSession 對(duì)象。
2. 我們要對(duì)?部分?法進(jìn)?攔截,?另?部分?法不攔截,如注冊(cè)?法和登錄?法是不攔截的,這樣的話排除?法的規(guī)則很難定義,甚?沒(méi)辦法定義。
那這樣如何解決呢?

3Spring攔截器

對(duì)于以上問(wèn)題 Spring 中提供了具體的實(shí)現(xiàn)攔截器:HandlerInterceptor,攔截器的實(shí)現(xiàn)分為以下兩個(gè)步驟:
1. 創(chuàng)建?定義攔截器,實(shí)現(xiàn) HandlerInterceptor 接?的 preHandle(執(zhí)?具體?法之前的預(yù)處理)?法。
2. 將?定義攔截器加? WebMvcConfigurer 的 addInterceptors ?法中。
具體實(shí)現(xiàn)如下。

3.1自定義攔截器

接下來(lái)使?代碼來(lái)實(shí)現(xiàn)?個(gè)?戶登錄的權(quán)限效驗(yàn),?定義攔截器是?個(gè)普通類,具體實(shí)現(xiàn)代碼如下:
/**
 * 創(chuàng)建一個(gè)攔截器
 */
@Component

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判斷是否登錄
        HttpSession session=request.getSession(false);
        if(session!=null&&session.getAttribute("username")!=null){
            //通過(guò),不進(jìn)行處理
            return true;
        }
        //表示沒(méi)有權(quán)限
        response.setStatus(401);
        return false;
    }
}

3.2將自定義攔截器加入到系統(tǒng)配置

將上?步中的?定義攔截器加?到系統(tǒng)配置信息中,具體實(shí)現(xiàn)代碼如下:
@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    //添加攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加攔截器
        registry.addInterceptor(loginInterceptor)
                //攔截哪些url
                .addPathPatterns("/**")
                //放過(guò)哪些url
                .excludePathPatterns("/api/user/login")
                .excludePathPatterns("/api/user/reg");
    }
    // 所有的接?添加 api 前綴
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("api", c -> true);
    }

}
其中:
●addPathPatterns:表示需要攔截的 URL,“**”表示攔截任意?法(也就是所有?法)。
●excludePathPatterns:表示需要排除的 URL。
說(shuō)明:以上攔截規(guī)則可以攔截此項(xiàng)?中的使? URL,包括靜態(tài)?件(圖??件、JS 和 CSS 等?件)
排除所有的靜態(tài)資源
// 攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
 registry.addInterceptor(new LoginInterceptor())
 .addPathPatterns("/**") // 攔截所有接?
 .excludePathPatterns("/**/*.js")
 .excludePathPatterns("/**/*.css")
 .excludePathPatterns("/**/*.jpg")
 .excludePathPatterns("/login.html")
 .excludePathPatterns("/**/login"); // 排除接?
}

登錄攔截器:

@Slf4j
@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/get")
    //獲取用戶信息
    public String getInfo(){
        log.info("get info");
        return "get info";
    }
    //注冊(cè)
    @RequestMapping("/reg")
    public String reg(){
        log.info("reg");
//        int a=10/0;
        return "reg";
    }
    @RequestMapping("/login")
    public boolean login(HttpServletRequest request,String username,String password){

        log.info("login");
        //判斷username和password是否為空
//        if(username!=null && "".equals(username)&& password!=null &&"".equals(password)){
//
//        }
        //Spring
        if(!StringUtils.hasLength(username)||!StringUtils.hasLength(password)){
            return false;
        }
        if(!"admin".equals(username) || !"admin".equals(password)) {
            return true;
        }
        HttpSession session = request.getSession(true);
        session.setAttribute("username", username);
        return true;



    }


}

Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)

直接訪問(wèn)get會(huì)被攔截,表示攔截器創(chuàng)建成功

4攔截器實(shí)現(xiàn)原理

正常情況下的調(diào)?順序:

Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)?

然?有了攔截器之后,會(huì)在調(diào)? Controller 之前進(jìn)?相應(yīng)的業(yè)務(wù)處理,執(zhí)?的流程如下圖所示:

Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)?

4.1 實(shí)現(xiàn)原理源碼分析

所有的 Controller 執(zhí)?都會(huì)通過(guò)?個(gè)調(diào)度器 DispatcherServlet 來(lái)實(shí)現(xiàn),這?點(diǎn)可以從 Spring Boot 控制臺(tái)的打印信息看出,如下圖所示:
Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)

?所有?法都會(huì)執(zhí)? DispatcherServlet 中的 doDispatch 調(diào)度?法,doDispatch 源碼如下:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try {
            try {
                ModelAndView mv = null;
                Exception dispatchException = null;

                try {
                    processedRequest = this.checkMultipart(request);
                    multipartRequestParsed = processedRequest != request;
                    mappedHandler = this.getHandler(processedRequest);
                    if (mappedHandler == null) {
                        this.noHandlerFound(processedRequest, response);
                        return;
                    }

                    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
                    String method = request.getMethod();
                    boolean isGet = HttpMethod.GET.matches(method);
                    if (isGet || HttpMethod.HEAD.matches(method)) {
                        long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                        if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
                            return;
                        }
                    }
					// 調(diào)用預(yù)處理【重點(diǎn)】
                    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                        return;
                    }
					// 執(zhí)行Contorller層的邏輯
                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
                    if (asyncManager.isConcurrentHandlingStarted()) {
                        return;
                    }

                    this.applyDefaultViewName(processedRequest, mv);
                    mappedHandler.applyPostHandle(processedRequest, response, mv);
                } catch (Exception var20) {
                    dispatchException = var20;
                } catch (Throwable var21) {
                    dispatchException = new NestedServletException("Handler dispatch failed", var21);
                }

                this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
            } catch (Exception var22) {
                this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);
            } catch (Throwable var23) {
                this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));
            }

        } finally {
            if (asyncManager.isConcurrentHandlingStarted()) {
                if (mappedHandler != null) {
                    mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
                }
            } else if (multipartRequestParsed) {
                this.cleanupMultipart(processedRequest);
            }

        }
    }

從上述源碼可以看出在開(kāi)始執(zhí)? Controller 之前,會(huì)先調(diào)? 預(yù)處理?法 applyPreHandle,?
applyPreHandle ?法的實(shí)現(xiàn)源碼如下:
    boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
        for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex = i++) {
            // 獲取項(xiàng)目中使用的攔截器, 我們之前就是實(shí)現(xiàn)了這個(gè)類,然后添加的攔截器
            // 在這里,我們自定義的攔截器就會(huì)被調(diào)用,用戶登陸權(quán)限驗(yàn)證的方法就會(huì)實(shí)現(xiàn),這就是攔截器實(shí)現(xiàn)的原理
            HandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);
            if (!interceptor.preHandle(request, response, this.handler)) {
                this.triggerAfterCompletion(request, response, (Exception)null);
                return false;
            }
        }

        return true;
    }
從上述源碼可以看出,在 applyPreHandle 中會(huì)獲取所有的攔截器 HandlerInterceptor 并執(zhí)?攔截器中的 preHandle ?法,這樣就會(huì)咱們前?定義的攔截器對(duì)應(yīng)上了,如下圖所示:
Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)

?此時(shí)?戶登錄權(quán)限的驗(yàn)證?法就會(huì)執(zhí)?,這就是攔截器的實(shí)現(xiàn)原理。

?4.2攔截器小結(jié)

通過(guò)上?的源碼分析,我們可以看出,Spring 中的攔截器也是通過(guò)動(dòng)態(tài)代理和環(huán)繞通知的思想實(shí)現(xiàn)的,?體的調(diào)?流程如下:
Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)

5拓展:統(tǒng)一前綴訪問(wèn)

所有請(qǐng)求地址添加 api 前綴:?

    // 所有的接?添加 api 前綴
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("api", c -> true);
    }
其中第?個(gè)參數(shù)是?個(gè)表達(dá)式,設(shè)置為 true 表示啟動(dòng)前綴。
我們?cè)谠L問(wèn)這個(gè)程序時(shí),就要加上api前綴才能訪問(wèn)到,否則會(huì)被攔截:
Spring Boot統(tǒng)一處理功能——攔截器,spring boot,java,數(shù)據(jù)庫(kù)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-638156.html

到了這里,關(guān)于Spring Boot統(tǒng)一處理功能——攔截器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot統(tǒng)一功能處理(攔截器)

    SpringBoot統(tǒng)一功能處理(攔截器)

    1.1自定義攔截器 寫(xiě)一個(gè)類去實(shí)現(xiàn) HandlerInterceptor接口 表示當(dāng)前類是一個(gè)攔截器,再 重寫(xiě)HandlerInterceptor接口中的方法 , preHandle 為在方法 執(zhí)行前攔截 ,postHandle為方法執(zhí)行中攔截,afterCompletion為方法執(zhí)行中攔截.需要在什么時(shí)候攔截就重寫(xiě)什么方法 2.1.配置攔截規(guī)則 實(shí)現(xiàn) WebMvcConfigur

    2024年02月14日
    瀏覽(16)
  • 【Spring Boot系列】- Spring Boot攔截器

    攔截器(Interceptor)是在面向切面編程中應(yīng)用的,就是在service或者一個(gè)方法前調(diào)用一個(gè)方法,或者在方法后調(diào)用一個(gè)方法。是基于JAVA的反射機(jī)制??梢愿鶕?jù) URL 對(duì)請(qǐng)求進(jìn)行攔截,主要應(yīng)用于登陸校驗(yàn)、權(quán)限驗(yàn)證、亂碼解決、性能監(jiān)控和異常處理等功能。 在 Spring Boot 項(xiàng)目中,

    2024年02月13日
    瀏覽(16)
  • spring boot 攔截器例子

    在Spring Boot中,攔截器是通過(guò)實(shí)現(xiàn)`HandlerInterceptor`接口來(lái)實(shí)現(xiàn)的。它允許你在請(qǐng)求到達(dá)控制器方法之前和之后執(zhí)行自定義的邏輯。下面我將為你提供一個(gè)簡(jiǎn)單的Spring Boot攔截器的例子。 假設(shè)我們有一個(gè)簡(jiǎn)單的控制器類`UserController`,其中有兩個(gè)請(qǐng)求處理方法:`getUser`和`saveUser`,

    2024年02月15日
    瀏覽(23)
  • Spring Boot 配置攔截器

    Spring Boot 配置攔截器

    通過(guò)攔截器,我們可以針對(duì)特定 URI 做攔截,做相關(guān)業(yè)務(wù)處理,比如檢查用戶是否登錄,打印每個(gè)請(qǐng)求的處理耗時(shí)等。 新建登錄驗(yàn)證類? LoginValidationInterceptor.java : 定義一個(gè)攔截器類后,您需要實(shí)現(xiàn)? HandlerInterceptor ?接口,其有三個(gè)方法可以重寫(xiě): preHandle : 在調(diào)用 Controller 方

    2024年02月08日
    瀏覽(24)
  • Spring Boot攔截器(Interceptor)詳解

    **攔截器(Interceptor)**同 Filter 過(guò)濾器一樣,它倆都是面向切面編程——AOP 的具體實(shí)現(xiàn)(AOP切面編程只是一種編程思想而已)。 你可以使用 Interceptor 來(lái)執(zhí)行某些任務(wù),例如在 Controller 處理請(qǐng)求之前編寫(xiě)日志,添加或更新配置…… 在 Spring 中,當(dāng)請(qǐng)求發(fā)送到 Controller 時(shí),在被 Contr

    2024年02月03日
    瀏覽(26)
  • Spring Boot攔截器與動(dòng)態(tài)代理深度剖析

    Spring Boot攔截器與動(dòng)態(tài)代理深度剖析

    ??歡迎來(lái)到架構(gòu)設(shè)計(jì)專欄~Spring Boot攔截器與動(dòng)態(tài)代理深度剖析 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁(yè):IT·陳寒的博客 ??該系列文章專欄:架構(gòu)設(shè)計(jì) ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技術(shù)和水平有限,如果

    2024年01月22日
    瀏覽(26)
  • spring boot 過(guò)濾器&攔截器與aop

    spring boot 過(guò)濾器&攔截器與aop

    在使用 Spring 框架時(shí),可以通過(guò)在 web.xml 配置文件中注冊(cè)過(guò)濾器,使其在請(qǐng)求進(jìn)入 Spring 前就能夠進(jìn)行預(yù)處理。這樣可以在請(qǐng)求進(jìn)入 Spring MVC 的 DispatcherServlet 之前,對(duì)請(qǐng)求進(jìn)行攔截、修改或者過(guò)濾。 過(guò)濾器在 Spring 中的應(yīng)用場(chǎng)景包括但不限于: 字符編碼過(guò)濾:通過(guò)過(guò)濾器,在

    2024年02月01日
    瀏覽(23)
  • Spring Boot攔截器與過(guò)濾器的區(qū)別

    Spring Boot攔截器與過(guò)濾器的區(qū)別

    在使用Spring Boot開(kāi)發(fā)Web應(yīng)用程序時(shí),您可能需要在處理請(qǐng)求之前或之后執(zhí)行某些操作。這些操作可以包括身份驗(yàn)證、日志記錄、性能監(jiān)測(cè)等。在這種情況下,您可以使用兩種不同的機(jī)制:攔截器和過(guò)濾器。本文將介紹這兩種機(jī)制及其區(qū)別,并提供一些示例代碼來(lái)演示如何在S

    2024年02月08日
    瀏覽(23)
  • 使用spring boot攔截器實(shí)現(xiàn)青少年模式

    便用Spring Boot攔截器采累計(jì)在線時(shí)間采實(shí)現(xiàn)青少年模式的步驟,可以參考以卜步驟: 1.創(chuàng)建一個(gè)攔截器類,實(shí)現(xiàn)Handlerlnterceptor 接口。 2.在攔截器類中,定義一個(gè)變量來(lái)記錄用戶在線時(shí)間。 3.在preHandle方法中,記錄用戶的登錄時(shí)間。 4.在afterCompletion方法中,計(jì)算用戶在線時(shí)間,

    2023年04月08日
    瀏覽(27)
  • Spring Boot實(shí)戰(zhàn):攔截器和監(jiān)聽(tīng)器的應(yīng)用指南

    Spring Boot實(shí)戰(zhàn):攔截器和監(jiān)聽(tīng)器的應(yīng)用指南

    當(dāng)使用Spring Boot時(shí),我們可以通過(guò)攔截器(Interceptor)和監(jiān)聽(tīng)器(Listener)來(lái)實(shí)現(xiàn)對(duì)請(qǐng)求和響應(yīng)的處理。攔截器和監(jiān)聽(tīng)器提供了一種可插拔的機(jī)制,用于在請(qǐng)求處理過(guò)程中進(jìn)行自定義操作,例如記錄日志、身份驗(yàn)證、權(quán)限檢查等。下面通過(guò)提供一個(gè)示例,展示如何使用攔截器和

    2024年02月09日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包