⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐
如果可以,麻烦各位看官顺手点个star~😊
如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆
文章目录
6 SpringMVC拦截器
6.1 概念
拦截器VS过滤器
相似点
三要素相同
- 拦截:必须先把请求拦住,才能执行后续操作;
- 过滤:拦截器或过滤器存在的意义就是对请求进行统一处理;
- 放行:对请求执行了必要操作后,放请求过去,让它访问原本想要访问的资源;
不同点
- 工作平台不同
- 过滤器工作在 Servlet 容器中
- 拦截器工作在 SpringMVC 的基础上
- 拦截的范围
- 过滤器:能够拦截到的最大范围是整个 Web 应用
- 拦截器:能够拦截到的最大范围是整个 SpringMVC 负责的请求
- IOC 容器支持
- 过滤器:想得到 IOC 容器需要调用专门的工具方法,是间接的
- 拦截器:它自己就在 IOC 容器中,所以可以直接从 IOC 容器中装配组件,也就是可以直接得到 IOC 容器的支持
选择
功能需要如果用 SpringMVC 的拦截器能够实现,就不使用过滤器。
6.2 使用
6.2.1 创建拦截器类
实现接口
public class Process01Interceptor implements HandlerInterceptor {
Logger logger = LoggerFactory.getLogger(this.getClass());
// 在处理请求的目标 handler 方法前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("Process01Interceptor preHandle方法");
// 返回true:放行
// 返回false:不放行
return true;
}
// 在目标 handler 方法之后,渲染视图之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.debug("Process01Interceptor postHandle方法");
}
// 渲染视图之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.debug("Process01Interceptor afterCompletion方法");
}
}
单个拦截器执行顺序:
preHandle()
方法- 目标handler方法
postHandle()
方法- 渲染视图
afterCompletion()
方法
在较低版本的 SpringMVC 中,实现HandlerInterceptor
接口需要把所有抽象方法都实现。但是又不是每个方法都需要使用,导致代码比较繁琐。
此时可以通过继承HandlerInterceptorAdapter
类同样可以创建拦截器类。HandlerInterceptorAdapter
类中已经给 HandlerInterceptor
接口提供了默认实现,我们继承后不需要把每个方法都实现,只需要把有用的方法重写即可。
在 SpringMVC 较高版本(例如:5.3版本以上)中,HandlerInterceptor
接口已经借助JDK1.8新特性让每个抽象方法都给出了默认实现,所以HandlerInterceptorAdapter
这个类被标记为过时。
6.2.2 注册拦截器
默认拦截全部请求
<!-- 注册拦截器 -->
<mvc:interceptors>
<!-- 直接通过内部 bean 配置的拦截器默认拦截全部请求(SpringMVC 范围内) -->
<bean class="com.atguigu.mvc.interceptor.Process01Interceptor"/>
</mvc:interceptors>
配置拦截路径
精确匹配:
<!-- 具体配置拦截器可以指定拦截的请求地址 -->
<mvc:interceptor>
<!-- 精确匹配 -->
<mvc:mapping path="/common/request/one"/>
<bean class="com.atguigu.mvc.interceptor.Process03Interceptor"/>
</mvc:interceptor>
匹配单层路径:
<mvc:interceptor>
<!-- /*匹配路径中的一层 -->
<mvc:mapping path="/common/request/*"/>
<bean class="com.atguigu.mvc.interceptor.Process04Interceptor"/>
</mvc:interceptor>
匹配多层路径:
<mvc:interceptor>
<!-- /**匹配路径中的多层 -->
<mvc:mapping path="/common/request/**"/>
<bean class="com.atguigu.mvc.interceptor.Process05Interceptor"/>
</mvc:interceptor>
配置不拦截路径
<mvc:interceptor>
<!-- /**匹配路径中的多层 -->
<mvc:mapping path="/common/request/**"/>
<!-- 使用 mvc:exclude-mapping 标签配置不拦截的地址 -->
<mvc:exclude-mapping path="/common/request/two/bbb"/>
<bean class="com.atguigu.mvc.interceptor.Process05Interceptor"/>
</mvc:interceptor>
6.2.3 执行顺序
preHandle()
方法:SpringMVC 会把所有拦截器收集到一起,然后按照配置顺序调用各个preHandle()
方法;- 目标 handler 方法;
postHandle()
方法:SpringMVC会把所有拦截器收集到一起,然后按照配置相反的顺序调用各个postHandle()
方法;- 渲染视图;
afterCompletion()
方法:SpringMVC 会把所有拦截器收集到一起,然后按照配置相反的顺序调用各个afterCompletion()
方法;