Spring Boot自定義Interceptor

1.定義Interceptor 

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
 
public class TimeInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /**
        SpringMVC 中的Interceptor 是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor 。
        每個Interceptor 的調用會依據它的聲明順序依次執行,而且最先執行的都是Interceptor 中的preHandle 方法,
        所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,
        也可以在這個方法中進行一些判斷來決定請求是否要繼續進行下去。
        該方法的返回值是布爾值Boolean類型的,當它返回爲false 時,
        表示請求結束,後續的Interceptor 和Controller 都不會再執行;
        當返回值爲true 時就會繼續調用下一個Interceptor 的preHandle 方法,
        如果已經是最後一個Interceptor 的時候就會是調用當前請求的Controller 方法。
         **/
 
        System.out.println("starttime----"+new Date().getTime());
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        /**
           由preHandle 方法的解釋我們知道這個方法包括後面要說到的afterCompletion
           方法都只能是在當前所屬的Interceptor 的preHandle 方法的返回值爲true 時才能被調用。
           postHandle 方法,顧名思義就是在當前請求進行處理之後,也就是Controller 方法調用之後執行,
           但是它會在DispatcherServlet 進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller
           處理之後的ModelAndView 對象進行操作。postHandle 方法被調用的方向跟preHandle 是相反的,
           也就是說先聲明的Interceptor 的postHandle 方法反而會後執行,這和Struts2 裏面的Interceptor 的執行過程有點類型。
           Struts2 裏面的Interceptor 的執行過程也是鏈式的,只是在Struts2 裏面需要手動調用ActionInvocation 的invoke 方
           法來觸發對下一個Interceptor 或者是Action 的調用,
           然後每一個Interceptor 中在invoke 方法調用之前的內容都是按照聲明順序執行的,
           而invoke 方法之後的內容就是反向的
         **/
        System.out.println("開始執行----postHandle()");
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        /*
        該方法也是需要當前對應的Interceptor 的preHandle 方法的返回值爲true 時纔會執行。顧名思義,該方法將在整個請求結束之後,
        也就是在DispatcherServlet 渲染了對應的視圖之後執行。
        這個方法的主要作用是用於進行資源清理工作的。
         */
        System.out.println("endtime----"+new Date().getTime());
 
    }
}

2. 註冊interceptor 

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        /**其中addInterceptor方法用於把剛纔創建的攔截器加入到registry中,addPathPatterns用 
           戶加入所要攔截的url,/**表示攔截所有請求。excludePathPatterns添加不需要攔截的請 
           求。 至此,一個攔截器就配置好了。如果需要配置多個攔截,只需要另外創建一個攔截器,給 
           registry再加一個inteceptor就可以了,不用再創建一個新的config配置類。
        **/
        registry.addInterceptor(new TimeInterceptor())
                .addPathPatterns("/person.html","/Person.html",
                                 "/questionnaire.html","/Questionnaire.html",
                                  "/result.html","/Result.html");;
    }
}

參考鏈接:https://blog.csdn.net/weixin_39881983/article/details/86588318



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章