Spring Boot使用處理器攔截器HandlerInterceptor

首先我們說說什么是處理器攔截器,SpringWebMVC的處理器攔截器,類似于Servlet開發(fā)中的過濾器Filter,用于處理器進(jìn)行預(yù)處理和后處理。

使用場景

1、日志記錄:記錄請求信息的日志,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)、計(jì)算PV(Page View)等。
2、權(quán)限檢查:如登錄檢測,進(jìn)入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
3、性能監(jiān)控:有時候系統(tǒng)在某段時間莫名其妙的慢,可以通過攔截器在進(jìn)入處理器之前記錄開始時間,在處理完后記錄結(jié)束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
4、通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續(xù)流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實(shí)現(xiàn)。
5、OpenSessionInView:如Hibernate,在進(jìn)入處理器打開Session,在完成后關(guān)閉Session。…………本質(zhì)也是AOP(面向切面編程),也就是說符合橫切關(guān)注點(diǎn)的所有功能都可以放入攔截器實(shí)現(xiàn)。

實(shí)現(xiàn)方式

1、引入spring-boot-starter-web
在pom.xml 中引入spring-boot-starter-web包。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2、建立攔截器
preHandle :在DispatcherServlet之前執(zhí)行。
postHandle:在controller執(zhí)行之后的DispatcherServlet之后執(zhí)行。
afterCompletion:在頁面渲染完成返回給客戶端之前執(zhí)行。

public class PiceaInterceptor implements HandlerInterceptor {
    /**
     *在DispatcherServlet之前執(zhí)行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("我是在DispatcherServlet之前執(zhí)行的方法");
        return true;
    }

    /**
     * 在controller執(zhí)行之后的DispatcherServlet之后執(zhí)行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("在controller執(zhí)行之后的DispatcherServlet之后執(zhí)行");
    }

    /**
     * 在頁面渲染完成返回給客戶端之前執(zhí)行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("在頁面渲染完成返回給客戶端之前執(zhí)行");
    }
}

3、建立WebAppConfigurer類
這個類的主要作用是注冊上我們配置的攔截器。

@Configuration
public class PiceaWebAppConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor())//增加過濾的方法類
                .addPathPatterns("/**");//定義過濾的范圍
    }

    @Bean
    public PiceaInterceptor authenticationInterceptor() {
        return new PiceaInterceptor();
    }
}

4、建立Contoller類
這個類比較簡單,不做特別說明

@RestController
public class PiceaContoller {

    @RequestMapping("/query")
    public void asyncTask() throws Exception {
        System.out.println("我是控制類里面的方法,我正在思考...............");
    }
}

5、測試結(jié)果
在瀏覽中輸入:http://localhost:2001/query
這個時候控制臺的輸入為如下圖片。

Spring-boot-fi-interceptor.png

其它注意

本文章樣例:
工程名:spring-boot-fi-interceptor
GitHub:https://github.com/zzyjb/SpringBootLearning

其它工程請移步

  1. Spring Boot使用過濾器Filter
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容