攔截器css
是指經過統一攔截瀏覽器向服務器發送的請求並進行加強的東西。主要應用例如:編碼,權限驗證。java
過濾器web
依賴於servlet容器。在實現上基於函數回調,能夠對幾乎全部請求進行過濾,可是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來作一些過濾操做,獲取咱們想要獲取的數據,好比:在過濾器中修改字符編碼;在過濾器中修改HttpServletRequest的一些參數,包括:過濾低俗文字、危險字符等。相似公路上的收費站。spring
共同點瀏覽器
拋開細節,過濾器和攔截器的功能很是類似。springboot
實現一個攔截器,服務器
1.實現HandlerInterceptor接口,實現三個方法。session
2.註冊攔截器,springboot是編寫一個配置類繼承WebMvcConfigurerAdapter重寫addInterceptors方法註冊mvc
3.若是須要配置攔截規則,能夠自行配置,參考官網文檔把。框架
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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 }
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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執行順序