springMVC攔截器和過濾器

攔截器css

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

過濾器web

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

共同點瀏覽器

拋開細節,過濾器和攔截器的功能很是類似。springboot

實現一個攔截器,服務器

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

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

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執行順序

相關文章
相關標籤/搜索