1. 程式人生 > >Spring Boot 2.x配置攔截器

Spring Boot 2.x配置攔截器

攔截器功能強大,能夠深入方法前後,常應用於日誌記錄、許可權檢查和效能檢測等,幾乎是專案中不可或缺的一部分,本文就來實現Spring Boot自定義攔截器的配置。

理論指導

:Spring Boot怎麼配置攔截器?

:配置一個攔截器需要兩步完成。

  1. 自定義攔截器,實現HandlerInterceptor這個介面。這個介面包括三個方法,preHandle是請求執行前執行的;postHandler是請求結束執行的,但只有preHandle方法返回true的時候才會執行;afterCompletion是檢視渲染完成後才執行,同樣需要preHandle返回true,該方法通常用於清理資源等工作。
  2. 註冊攔截器。 作用是確定攔截器和攔截的URL。需要繼承WebMvcConfigurationSupport並重寫addInterceptor方法,WebMvcConfigureAdapter已經過時了!!

程式碼實現

目錄結構:

具體程式碼:

MyInterceptor.java

public class MyInterceptor implements HandlerInterceptor {

    /**
     * preHandle在執行Controller之前執行,返回true,則繼續執行Contorller
     * 返回false則請求中斷。
     */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)
            throws Exception {
        //只有返回true才會繼續向下執行,返回false取消當前請求 
        long startTime = System.currentTimeMillis();
        httpServletRequest.setAttribute("startTime", startTime);
        return true;
    }

    /**
     * postHandle是在請求執行完,但渲染ModelAndView返回之前執行
     */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,
            ModelAndView modelAndView) throws Exception {
        long startTime = (Long) httpServletRequest.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        long executeTime = endTime - startTime;
        StringBuilder sb = new StringBuilder(1000);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = simpleDateFormat.format(new Date());
        sb.append("-----------------------").append(date).append("-------------------------------------\n");
        sb.append("URI       : ").append(httpServletRequest.getRequestURI()).append("\n");
        sb.append("CostTime  : ").append(executeTime).append("ms").append("\n");
        sb.append("-------------------------------------------------------------------------------");
        System.out.println(sb.toString());
    }

    /**
     * afterCompletion是在整個請求執行完畢後執行
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            Object o, Exception e) throws Exception {
    }

}

RegisterInterceptor.java

/**
 * 繼承WebMvcConfigurationSupport繼承並重寫addInterceptor方法用於註冊攔截器
 * WebMvcConfigureAdapter已經過時了!!
 */
@Configuration
public class RegisterInterceptor extends WebMvcConfigurationSupport {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

攔截效果