SpringMVC配置多个自定义拦截器

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

6、参考博客

http://www.cnblogs.com/davidwang456/p/4108355.html

http://www.cnblogs.com/yhtboke/p/5749063.html

原文地址:https://www.cnblogs.com/mao2080/p/6769680.html