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 的执行顺序大致为:

  1. 请求到达 DispatcherServlet
  2. DispatcherServlet 发送至 Interceptor ,执行 preHandle
  3. 请求达到 Controller
  4. 请求结束后,postHandle 执行
  5. 拦截器1放行,拦截器2 preHandle才会执行。

    拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。

    只要有一个拦截器不放行,postHandle不会执行。

  6. 拦截器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用法的更多相关文章

  1. springMvc中实现拦截器Interceptor以及添加静态资源映射

    这个代码写了很久了,多久呢?2018年12-20号写的.... 废话不多说,简化一下,作为笔记. 注: public class springmvcConfig extends WebMvcConfi ...

  2. 9.springMVC中的拦截器

    springMVC中的拦截器大概大致可以分为以下几个步骤去学习: 1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用 2.在springMVC的配置文件中添加拦 ...

  3. SpringMVC中的拦截器、过滤器的区别、处理异常

    1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...

  4. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...

  5. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  6. Spring MVC中的拦截器Interceptor

    谈谈spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先设置数据以及统计方法的执行效率等等.今天就来详细的谈一下spring中的拦截器.spring中拦截器主 ...

  7. SpringMVC中的拦截器

    1. 自定义拦截器 实现HandlerInterceptor接口 拦截器一: package cn.rodge.ssm.interceptor;import javax.servlet.http.Ht ...

  8. (转)Angular中的拦截器Interceptor

    什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 转之:http://my.osch ...

  9. springmvc中配置拦截器

    -------------------------------------------- 登陆controller方法 @Controller public class LoginController ...

随机推荐

  1. 调用DATASNAP+FIREDAC的远程方法有时会执行二次SQL或存储过程的BUG(转永喃兄)

    调用DATASNAP+FIREDAC的远程方法有时会执行二次SQL或存储过程的BUG 1)查询会重复执行的情形:Result := DATASETPROVIDER.Data会触发它关联的DATASET ...

  2. 使用sigaction函数

    sigaction函数 修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数) :失败:-1,设置errno 参数: act:传入参数,新的处理方式.oldact:传出参数,旧的处理方式. ...

  3. U3D 编辑器中sceneview下相机操作相关

    前几天在项目中想要实现一个编辑器模式下的3D空间画线功能,几经周折,还是作废. 原因有:相机空间到世界空间转换问题对于Z值不清楚,U3D自定义坐标轴控制问题,射线与平面求交点不对, 一个关键问题是:编 ...

  4. Linux后门入侵检测工具

    一.rootkit简介 rootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到入侵和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现 ...

  5. 二维码API接口

    1.http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.54admin.net 2.http://b.bshare ...

  6. python机器学习一:KNN算法实现

    所谓的KNN算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个 ...

  7. mybatis实现一对多连接查询

    问题:两个对象User和Score,它们之间的关系为一对多. 底层数据库为postgresql,ORM框架为mybatis. 关键代码如下: mybatis配置文件如下: mybatis.xml文件内 ...

  8. Oracle 导入大量数据

    环境是这样的: 需要导入大量数据到Oracle,目前Oracle已建立索引和触发器了,导入的数据是树型结构,需要关联. 采用的方法是: 删除以前数据库的索引和触发器,用OracleBulkCopy批量 ...

  9. 吴裕雄 python神经网络(8)

    # -*- coding=utf-8 -*-import numpy as npimport kerasfrom keras.models import Sequentialfrom keras.la ...

  10. spark 学习_rdd常用操作

    [spark API 函数讲解 详细 ]https://www.iteblog.com/archives/1399#reduceByKey [重要API接口,全面 ] http://spark.apa ...