特別提示:本人博客部分有參考網絡其他博客,但均是本人親手編寫過並驗證通過。如發現博客有錯誤,請及時提出以免誤導其他人,謝謝!歡迎轉載,但記得標明文章出處:
http://www.cnblogs.com/mao2080/
常用場景
1、日志記錄:記錄請求信息的日志,以便進行信息監控、信息統計、計算PV(Page View)等。
2、權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
3、性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完后記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
4、通用行為:讀取cookie得到用戶信息並將用戶對象放入請求,從而方便后續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現。
1、權限攔截器
1 package com.mao; 2 import javax.servlet.http.HttpServletRequest; 3 import javax.servlet.http.HttpServletResponse; 4 5 import org.springframework.web.servlet.HandlerInterceptor; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * 10 * 項目名稱:--- 11 * 模塊名稱:接入層 12 * 功能描述:權限攔截器 13 * 創建人: mao2080@sina.com 14 * 創建時間:2017年4月25日 下午8:53:49 15 * 修改人: mao2080@sina.com 16 * 修改時間:2017年4月25日 下午8:53:49 17 */ 18 public class AuthsInterceptor implements HandlerInterceptor { 19 20 /** 21 * 22 * 描述:執行方法前 23 * @author mao2080@sina.com 24 * @created 2017年4月25日 下午9:01:44 25 * @since 26 * @param request HttpServletRequest 27 * @param response HttpServletResponse 28 * @param handler handler 29 * @return 30 * @throws Exception 31 */ 32 @Override 33 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 34 System.out.println("PowerInterceptor:"+request.getContextPath()+","+request.getRequestURI()+","+request.getMethod()); 35 return true; 36 } 37 38 /** 39 * 40 * 描述:視圖返回渲染之前被調用 41 * @author mao2080@sina.com 42 * @created 2017年4月25日 下午9:01:47 43 * @since 44 * @param request HttpServletRequest 45 * @param response HttpServletResponse 46 * @param handler handler 47 * @param modelAndView ModelAndView 48 * @throws Exception 49 */ 50 @Override 51 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 52 System.out.println("PowerInterceptor:postHandle"); 53 } 54 55 /** 56 * 57 * 描述:渲染視圖之后執行 58 * @author mao2080@sina.com 59 * @created 2017年4月25日 下午9:01:51 60 * @since 61 * @param request HttpServletRequest 62 * @param response HttpServletResponse 63 * @param handler handler 64 * @param ex Exception 65 * @throws Exception 66 */ 67 @Override 68 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 69 System.out.println("PowerInterceptor:afterCompletion"); 70 } 71 72 }
2、日志攔截器
1 package com.mao; 2 import javax.servlet.http.HttpServletRequest; 3 import javax.servlet.http.HttpServletResponse; 4 5 import org.springframework.web.servlet.HandlerInterceptor; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * 10 * 項目名稱:--- 11 * 模塊名稱:接入層 12 * 功能描述:日志攔截器 13 * 創建人: mao2080@sina.com 14 * 創建時間:2017年4月25日 下午8:53:49 15 * 修改人: mao2080@sina.com 16 * 修改時間:2017年4月25日 下午8:53:49 17 */ 18 public class LogerInterceptor implements HandlerInterceptor { 19 20 /** 21 * 22 * 描述:執行方法前 23 * @author mao2080@sina.com 24 * @created 2017年4月25日 下午9:01:44 25 * @since 26 * @param request HttpServletRequest 27 * @param response HttpServletResponse 28 * @param handler handler 29 * @return 30 * @throws Exception 31 */ 32 @Override 33 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 34 System.out.println("LogerInterceptor:"+request.getContextPath()+","+request.getRequestURI()+","+request.getMethod()); 35 return true; 36 } 37 38 /** 39 * 40 * 描述:視圖返回渲染之前被調用 41 * @author mao2080@sina.com 42 * @created 2017年4月25日 下午9:01:47 43 * @since 44 * @param request HttpServletRequest 45 * @param response HttpServletResponse 46 * @param handler handler 47 * @param modelAndView ModelAndView 48 * @throws Exception 49 */ 50 @Override 51 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 52 System.out.println("LogerInterceptor:postHandle"); 53 } 54 55 /** 56 * 57 * 描述:渲染視圖之后執行 58 * @author mao2080@sina.com 59 * @created 2017年4月25日 下午9:01:51 60 * @since 61 * @param request HttpServletRequest 62 * @param response HttpServletResponse 63 * @param handler handler 64 * @param ex Exception 65 * @throws Exception 66 */ 67 @Override 68 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 69 System.out.println("LogerInterceptor:afterCompletion"); 70 } 71 72 }
3、登錄攔截器
1 package com.mao; 2 import javax.servlet.http.HttpServletRequest; 3 import javax.servlet.http.HttpServletResponse; 4 5 import org.springframework.web.servlet.HandlerInterceptor; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * 10 * 項目名稱:--- 11 * 模塊名稱:接入層 12 * 功能描述:登錄攔截器 13 * 創建人: mao2080@sina.com 14 * 創建時間:2017年4月25日 下午8:53:49 15 * 修改人: mao2080@sina.com 16 * 修改時間:2017年4月25日 下午8:53:49 17 */ 18 public class LoginInterceptor implements HandlerInterceptor { 19 20 /** 21 * 22 * 描述:執行方法前 23 * @author mao2080@sina.com 24 * @created 2017年4月25日 下午9:01:44 25 * @since 26 * @param request HttpServletRequest 27 * @param response HttpServletResponse 28 * @param handler handler 29 * @return 30 * @throws Exception 31 */ 32 @Override 33 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 34 System.out.println("LoginInterceptor:"+request.getContextPath()+","+request.getRequestURI()+","+request.getMethod()); 35 return true; 36 } 37 38 /** 39 * 40 * 描述:視圖返回渲染之前被調用 41 * @author mao2080@sina.com 42 * @created 2017年4月25日 下午9:01:47 43 * @since 44 * @param request HttpServletRequest 45 * @param response HttpServletResponse 46 * @param handler handler 47 * @param modelAndView ModelAndView 48 * @throws Exception 49 */ 50 @Override 51 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 52 System.out.println("LoginInterceptor:postHandle"); 53 } 54 55 /** 56 * 57 * 描述:渲染視圖之后執行 58 * @author mao2080@sina.com 59 * @created 2017年4月25日 下午9:01:51 60 * @since 61 * @param request HttpServletRequest 62 * @param response HttpServletResponse 63 * @param handler handler 64 * @param ex Exception 65 * @throws Exception 66 */ 67 @Override 68 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 69 System.out.println("LoginInterceptor:afterCompletion"); 70 } 71 72 }
4、集中配置
1 package com.mao; 2 3 import org.springframework.context.annotation.ComponentScan; 4 import org.springframework.context.annotation.Configuration; 5 import org.springframework.web.servlet.config.annotation.EnableWebMvc; 6 import org.springframework.web.servlet.config.annotation.InterceptorRegistration; 7 import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 8 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 9 10 /** 11 * 12 * 項目名稱:--- 13 * 模塊名稱:接入層 14 * 功能描述:系統攔截器配置 15 * 創建人: mao2080@sina.com 16 * 創建時間:2017年4月25日 下午8:53:49 17 * 修改人: mao2080@sina.com 18 * 修改時間:2017年4月25日 下午8:53:49 19 */ 20 @Configuration 21 @ComponentScan(basePackages={"com.web.common"}) 22 @EnableWebMvc 23 public class WebMVCConfiguration extends WebMvcConfigurerAdapter{ 24 25 /** 26 * 27 * 描述:添加攔截器 28 * @author mao2080@sina.com 29 * @created 2017年4月25日 下午8:50:54 30 * @since 31 * @param registry 32 */ 33 @Override 34 public void addInterceptors(InterceptorRegistry registry) { 35 /**日志攔截器*/ 36 this.excludePathPatterns(registry.addInterceptor(new LogerInterceptor())); 37 /**登錄攔截器*/ 38 this.excludePathPatterns(registry.addInterceptor(new LoginInterceptor())); 39 /**權限攔截器*/ 40 this.excludePathPatterns(registry.addInterceptor(new AuthsInterceptor())); 41 } 42 43 /** 44 * 45 * 描述:過濾URL 46 * @author mao2080@sina.com 47 * @created 2017年4月26日 上午9:57:08 48 * @since 49 * @param registration 50 */ 51 public void excludePathPatterns(InterceptorRegistration registration){ 52 registration.addPathPatterns("/*Controller/*"); 53 registration.excludePathPatterns("/login"); 54 registration.excludePathPatterns("/register"); 55 registration.excludePathPatterns("/getToken"); 56 } 57 58 }
5、訪問結果
PowerInterceptor:/laccess,/access/testController/getCognito,GET
LoginInterceptor:postHandle
LogerInterceptor:postHandle