特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处: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