springMVC攔截器和過濾器


攔截器

是指通過統一攔截瀏覽器向服務器發送的請求並進行增強的東西。主要應用例如:編碼,權限驗證。

過濾器

依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數據,比如:在過濾器中修改字符編碼;在過濾器中修改HttpServletRequest的一些參數,包括:過濾低俗文字、危險字符等。類似公路上的收費站。

共同點

拋開細節,過濾器和攔截器的功能非常相似。

實現一個攔截器,

1.實現HandlerInterceptor接口,實現三個方法。

2.注冊攔截器,springboot是編寫一個配置類繼承WebMvcConfigurerAdapter重寫addInterceptors方法注冊

3.如果需要配置攔截規則,可以自行配置,參考官網文檔把。

 1 package com.example.demo;
 2 
 3 import org.springframework.web.servlet.HandlerInterceptor;
 4 import org.springframework.web.servlet.ModelAndView;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 /**
10  * Created by 20160216 on 2018/2/8.
11  */
12 public class SessionInterceptor implements HandlerInterceptor
13 {
14     @Override
15     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
16         System.out.println("uri="+request.getRequestURI());
17         //登錄不做攔截
18         if(request.getRequestURI().equals("/userbg/login") || request.getRequestURI().equals("/user/login_view"))
19         {
20             return true;
21         }
22         //驗證session是否存在
23         Object obj = request.getSession().getAttribute("_session_user");
24         if(obj == null)
25         {
26             response.sendRedirect("/user/login_view");
27             return false;
28         }
29         return true;
30     }
31 
32     @Override
33     public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
34 
35     }
36 
37     @Override
38     public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
39 
40     }
41 }
定義攔截器
 1 @Configuration
 2 public class MyMvcConfig extends WebMvcConfigurerAdapter {
 3     /**
 4      * 靜態資源配置
 5      */
 6     /*@Override
 7     public void addResourceHandlers(ResourceHandlerRegistry registry) {
 8         registry.addResourceHandler("/img/**")
 9                 .addResourceLocations("classpath:/imgs/");
10         
11         super.addResourceHandlers(registry);
12     }*/
13     
14     /**
15      * 默認首頁配置
16      */
17     @Override
18     public void addViewControllers(ViewControllerRegistry registry) {
19         registry.addViewController("/").setViewName("forward:/index");
20         registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
21         super.addViewControllers(registry);
22     } 
23     
24     /**
25      * interceptor配置
26      */
27     @Override
28     public void addInterceptors(InterceptorRegistry registry) {
29         registry.addInterceptor(new SessionInterceptor())
30                 //添加需要驗證登錄用戶操作權限的請求
31                 .addPathPatterns("/**")
32                 //排除不需要驗證登錄用戶操作權限的請求
33                 .excludePathPatterns("/css/**")
34                 .excludePathPatterns("/js/**")
35                 .excludePathPatterns("/images/**");
36     }
37 }
注冊攔截器

關於剛剛實現的方法

1.preHandle在請求之前調用,返回值可以繼續或終止請求,參數有res,rep,obj,表示的是當前請求的目標對象,就是controller實例。

2.postHandle是請求后調用,可以改變視圖或者修改發往視圖的方法,參數req,res,obj,mv。

3.afterCompletion請求結束調用。

執行多個攔截器

先執行攔截器1的pre >>> 攔截器2的pre >>> 攔截器2的post >>> 攔截器1的post >>> 攔截器2的afterCompletion >>> 攔截器1的afterCompletion

攔截器其他實現方式

1可以實現WebRequestInterceptor方法,但是功能沒有上面的強大,一般不用.

攔截器和過濾器的區別

Filte依賴Servlet容器,基於回調函數,過濾范圍大。

Interceptor依賴框架容器,基於反射機制,至過濾請求。

這張圖是加了過濾器和攔截器的springmvc執行順序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM