1. 程式人生 > >springboot 自定義interceptor 對請求進行攔截

springboot 自定義interceptor 對請求進行攔截

  • 自定義interceptor

  • package com.zhk.demo.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());
    
        }
    }
    

      

  • 註冊interceptor 

  • package com.zhk.demo.config;
    
    
    import com.zhk.demo.interceptor.TimeInterceptor;
    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) {
            registry.addInterceptor(new TimeInterceptor());
        }
    }