springmvc拦截器

目录

拦截器:

拦截器的执行原理

拦截器的使用步骤:

拦截器的执行时间:

 拦截器执行的时机

拦截器实现的两种方式

HandlerInterceptor接口分析

 拦截器的实现步骤

拦截器和过滤器的区别


SpringMVC中的interceptor拦截器,它主要的作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前。”当然处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

拦截器:

1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
2)拦截器和过滤器类似,功能方向侧重点不同。 过滤器是用来过滤器请求参数,设置编码字符集等工作。拦截器是拦截用户的请求,做请求做判断处理的。
3)拦截器是全局的,可以对多个Controller做拦截。 
   一个项目中可以有0个或多个拦截器, 他们在一起拦截用户的请求。
    拦截器常用在:用户登录处理,权限检查, 记录日志。

一般拦截器被用在:

日志记录:记录请求信息的日志

权限检查:如登录检查

性能检测:检测方法的执行时间

拦截器的执行原理

springmvc拦截器_第1张图片

拦截器的使用步骤:


 1.定义类实现HandlerInterceptor接口
 2.在springmvc配置文件中,声明拦截器, 让框架知道拦截器的存在。

 

拦截器的执行时间:


  1)在请求处理之前, 也就是controller类中的方法执行之前先被拦截。
  2)在控制器方法执行之后也会执行拦截器。
  3)在请求处理完成后也会执行拦截器。

springmvc拦截器_第2张图片

 拦截器执行的时机

(1)preHandle():在请求被处理之前进行操作

(2)preHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果

(3)afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源

拦截器实现的两种方式

1)继承HandlerInterceptorAdapter的父类

2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式

HandlerInterceptor接口分析

Spring的HandlerMapping支持拦截器,拦截器必须实现HandlerInterceptor接口,此接口里面有下面3中方法:

1.preHandle()处理器执行前被调用,方法返回true标识继续调用其他拦截器或者处理器,返回false表示中断流程,后续的拦截器和处理器不再执行。

2.postHandle()处理器执行后,视图执行前调用,此时而已通过ModelAndView对象对数据模型数据进行处理或对视图进行处理。

3.afterCompletion()整个过程结束后调用,比如性能监控中我们在这里可以记录结束时间并输出消耗的时间,也可以在这里写对资源的清理,但是只有preHandle()返回true时才会执行afterCompletion方法。

 拦截器的实现步骤

1)改造登录方法,在session中存储用户信息,用于进行权限验证

2)开发拦截器的功能,实现HandlerInterceptor接口,重写preHandle()方法

3)在springmvc.xml文件中注册拦截器springmvc拦截器_第3张图片springmvc拦截器_第4张图片

springmvc拦截器_第5张图片

 开发权限验证拦截器springmvc拦截器_第6张图片springmvc拦截器_第7张图片

 拦截器链springmvc拦截器_第8张图片

 


拦截器:看做是多个Controller中公用的功能,集中到拦截器统一处理。使用的aop的思想


多个拦截器:
第一个拦截器preHandle=true , 第二个拦截器preHandle=true 

111111-拦截器的MyInterceptor的preHandle()
22222-拦截器的MyInterceptor的preHandle()
=====执行MyController中的doSome方法=====
22222-拦截器的MyInterceptor的postHandle()
111111-拦截器的MyInterceptor的postHandle()
22222-拦截器的MyInterceptor的afterCompletion()
111111-拦截器的MyInterceptor的afterCompletion()


第一个拦截器preHandle=true , 第二个拦截器preHandle=false

111111-拦截器的MyInterceptor的preHandle()
22222-拦截器的MyInterceptor的preHandle()
111111-拦截器的MyInterceptor的afterCompletion()


第一个拦截器preHandle=false , 第二个拦截器preHandle=true|false

111111-拦截器的MyInterceptor的preHandle()


拦截器和过滤器的区别

1.过滤器是servlet中的对象,  拦截器是框架中的对象
2.过滤器实现Filter接口的对象, 拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。
  拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.过滤器是tomcat服务器创建的对象
  拦截器是springmvc容器中创建的对象
6.过滤器是一个执行时间点。
  拦截器有三个执行时间点
7.过滤器可以处理jsp,js,html等等
  拦截器是侧重拦截对Controller的对象。 如果你的请求不能被DispatcherServlet接收, 这个请求不会执行拦截器内容
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应

你可能感兴趣的:(SpringMVC,java,servlet,spring)