【SSM】SpringMVC系列——拦截器

发布于:2022-08-05 ⋅ 阅读:(342) ⋅ 点赞:(0)

第3章SpringMVC拦截器

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

3.1拦截器介绍

3.1.1拦截器的应用场景

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

2、权限检查,如登录检查

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

3.1.2 拦截器的执行原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqBodrne-1659671430939)(../../../../Pictures/Spring/wps21.jpg)]

3.1.3拦截器执行的时机

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

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

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

3.1.4 拦截器实现的两种方式

1)继承HandlerInterceptorAdapter的父类

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

3.2HandlerInterceptor接口分析

自定义拦截器,需要实现 HandlerInterceptor 接口。而该接口中含有三个方法:

(1) preHandle

该方法在处理器方法执行之前执行。其返回值为 boolean,若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。

(2) postHandle

该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。

(3) afterCompletion

当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。

3.3自定义拦截器实现权限验证

实现一个权限验证拦截器。

  1. 修改web.xml文件中请求路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ffe4DyLP-1659671430940)(../../../../Pictures/Spring/wps22.jpg)]

  1. 将所有的页面放入WEB-INF目录下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g4XEeSBs-1659671430941)(../../../../Pictures/Spring/wps23.jpg)]

  1. 开发登录action

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9K5ELi9-1659671430942)(../../../../Pictures/Spring/wps24.jpg)]

  1. 开发拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Se6ZZyT-1659671430942)(../../../../Pictures/Spring/wps25.jpg)]

  1. 配置springmvc.xml文件
<!--注册拦截器--> 
<mvc:interceptors>  
    <mvc:interceptor> 
        <!--配置拦截的路径(哪些请求被拦截)--> 
        <mvc:mapping path="/**"/> 
        <!--设置放行的请求-->    
        <mvc:exclude-mapping path="/login"></mvc:exclude-mapping>  
        <mvc:exclude-mapping path="/showLogin"></mvc:exclude-mapping>    
        <!--设置进行功能处理的拦截器类-->  
        <bean class="com.bjpowernode.interceptor.LoginInterceptor"></bean> 
    </mvc:interceptor> 
</mvc:interceptors> 

3.4 过滤器和拦截器的区别

1、实现原理不同

过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。

2、使用范围不同

  • 过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。
  • 拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。

3、触发时机不同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUepoiJA-1659671430943)(../../../../Pictures/Spring/image-20220805113721158.png)]

  • 过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
  • 拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

4、拦截的请求范围不同

Filter 处理中
Interceptor 前置
Interceptor 处理中
Interceptor 后置
Filter 处理中
  • 过滤器Filter执行了两次,拦截器Interceptor只执行了一次。
  • 这是因为过滤器几乎可以对所有进入容器的请求起作用,
  • 而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。

5、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

  • ​ ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  • ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  • ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  • ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFauAMAZ-1659671430944)(../../../../Pictures/Spring/image-20220805113828880.png)]

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到