springmvc中的拦截器interceptor用法
1.配置拦截器
在springMVC.xml配置文件增加:

1 <mvc:interceptors>
2 <!-- 日志拦截器 -->
3 <mvc:interceptor>
4 <mvc:mapping path="/**" />
5 <mvc:exclude-mapping path="/static/**" />
6 <bean class="拦截器java代码路径" />
7 </mvc:interceptor>
8 </mvc:interceptors>

说明:
1)mvc:mapping 拦截器路径配置
2)mvc:exclude-mapping 拦截器不需要拦截的路径
在mvc:interceptors标签下声明interceptor主要有两种方式:
- 直接定义一个Interceptor实现类的bean对象。使用这种方式声明的Interceptor拦截器将会对所有的请求进行拦截。
- 使用mvc:interceptor标签进行声明。使用这种方式进行声明的Interceptor可以通过mvc:mapping子标签来定义需要进行拦截的请求路径。
2、样例:

1 public class LogsInterceptor extends HandlerInterceptorAdapter {
2
3 private static final Logger logger = LoggerFactory.getLogger(LogsInterceptor.class);
4
5 private NamedThreadLocal<String> logContext = new NamedThreadLocal<String>("log-id");
6
7 @Autowired
8 private TLogDao logDao;
9
10 /**
11 * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,
12 * SpringMVC中的Interceptor拦截器是链式的,可以同时存在多个Interceptor,
13 * 然后SpringMVC会根据声明的前后顺序一个接一个的执行,
14 * 而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
15 * SpringMVC的这种Interceptor链式结构也是可以进行中断的,
16 * 这种中断方式是令preHandle的返回值为false,当preHandle的返回值为false的时候整个请求就结束了。
17 */
18 @Override
19 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
20 String host = request.getRemoteHost();
21 String url = request.getRequestURI();
22 TLogEntity entity = new TLogEntity();
23 entity.setCreateTime(new Timestamp(System.currentTimeMillis()));
24 entity.setCreateUser("admin");
25 entity.setIpAddress(host);
26 entity.setLogUrl(url);
27 entity.setIsSuccess("N");
28 logDao.save(entity);
29 logContext.set(entity.getLogId());
30
31 logger.debug("IP为---->>> " + host + " <<<-----访问了系统");
32 return true;
33 }
34
35 /**
36 * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
37 * postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 后, 也就是在Controller的方法调用之后执行,
38 * 但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操作。
39 * 这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,
40 * 这跟Struts2里面的拦截器的执行过程有点像,
41 * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,
42 * Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor或者是调用action,
43 * 然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。
44 */
45 @Override
46 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
47 }
48
49 /**
50 * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
51 * 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行, 这个方法的主要作用是用于清理资源的,
52 */
53 @Override
54 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
55 String host = request.getRemoteHost();
56 String logId = logContext.get();
57 TLogEntity entity = logDao.findOne(logId);
58 entity.setIsSuccess("Y");
59 logDao.save(entity);
60
61 logger.debug("IP为---->>> " + host + " <<<-----访问成功");
62 }
63
64 }

在这个拦截器中,在方法执行前可以做session或权限的。
总结:
interceptor 的执行顺序大致为:
- 请求到达 DispatcherServlet
- DispatcherServlet 发送至 Interceptor ,执行 preHandle
- 请求达到 Controller
- 请求结束后,postHandle 执行
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。
拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。
Spring 中主要通过 HandlerInterceptor 接口来实现请求的拦截,实现 HandlerInterceptor 接口需要实现下面三个方法:
- preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。
- postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改
- afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等
参考链接
https://www.cnblogs.com/lcngu/p/7096597.html
https://www.cnblogs.com/junzi2099/p/8022058.html
https://www.cnblogs.com/moxiaotao/p/9663351.html
springmvc中的拦截器interceptor用法的更多相关文章
- springMvc中实现拦截器Interceptor以及添加静态资源映射
这个代码写了很久了,多久呢?2018年12-20号写的.... 废话不多说,简化一下,作为笔记. 注: public class springmvcConfig extends WebMvcConfi ...
- 9.springMVC中的拦截器
springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...
- SpringMVC中的拦截器、过滤器的区别、处理异常
1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...
- 【SpringMVC学习11】SpringMVC中的拦截器
Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- Spring MVC中的拦截器Interceptor
谈谈spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先设置数据以及统计方法的执行效率等等.今天就来详细的谈一下spring中的拦截器.spring中拦截器主 ...
- SpringMVC中的拦截器
1. 自定义拦截器 实现HandlerInterceptor接口 拦截器一: package cn.rodge.ssm.interceptor;import javax.servlet.http.Ht ...
- (转)Angular中的拦截器Interceptor
什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 转之:http://my.osch ...
- springmvc中配置拦截器
-------------------------------------------- 登陆controller方法 @Controller public class LoginController ...
随机推荐
- epoll_wait 时 POLLERR 与 POLLIN 同时返回的现象解析(转)
今天code review时,同事B对我代码中的poll()的处理做法提出了异议.于是做了些研究,还发现了一些好玩的故事. 异议的代码 我的代码是参考manpage写的,类似下面的做法.同事B说没有处 ...
- 尚硅谷springboot学习4-helloworld探究
1.POM文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- 解决linux下访问https站点问题
pfx转jks:(注:因jks要求密码长度不能小于6位,所以申请pfx证书时,密码长度最好不小于6位) keytool -importkeystore -v -srckeystore ***.pfx ...
- Reduction: the word AT
Reduction: the word AT Share Tweet Share Tagged With: AT Reduction Study the AT reduction. There ar ...
- mycat 单库分表
上次把mycat的读写分离搞定了,这次试下单库分表,顾名思义就是在一个库里把一个表拆分为多个 需要配置的配置文件为 schema.xml 配置内容如下 <!DOCTYPE mycat:schem ...
- flume 详细介绍
http://blog.csdn.net/a2011480169/article/details/51544664 配有详细的例子. http://www.cnblogs.com/gongxijun/ ...
- C++之 模板Template的使用
转自https://www.cnblogs.com/cynchanpin/p/7127897.html 1.在c++Template中非常多地方都用到了typename与class这两个关键字,并且好 ...
- Linux基本操作指令
Linux操作指令 到达当前用户目录:cd ~ 获得管理员权限执行:sudo 解压缩:tar -zxf XXX.tgz 安装包:dpkg -i XXX.deb 通过链接下载文件:wget http: ...
- MyBatis 3 使用注解配置SQL映射器
l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @Sel ...
- centos 6.x系统升级glibc库至2.15版本的快速解决办法
CentOS 6.x系统升级glibc库至2.15版本的快速解决办法 1.先确保相关软件包已经安装 yum install -y glibc yum install -y glibc-common ...