1.拦截器的作用
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行
预处理
和
后处理
。
将拦截器按一定的顺序联结成一条链,这条链称为
拦截器链(Interceptor Chain)
。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是
AOP思想的具体实现。
与过滤器不同的是,拦截器只是对处理器(Controller中的方法)进行拦截,并不对,JS,JSP等一些静态资源拦截
【引用原文链接见章底】
Interceptor
拦截器,是SpringMVC提供的,用来拦截Controller层方法的拦截器,和
Filter
过滤器的作用类型类似;- 不同的是:拦截器
Interceptor
主要进行
记录日志,判断用户是否登录,过滤权限(没有登录就跳转登录之类的)
;而过滤器则对全局进行过滤,主要用于编码过滤,统一编码- 拦截器
interceptor
:用来拦截Controller控制器的方法,主要用于实现权限分配,对没有权限的用户进行拦截(例如:购物车,只有登录了才能查看)。- 【注意】一般请求都是先通过过滤器filter过滤,才会被拦截器
interceptor
处理,决定是否放行,两个过程有任何一个不放行,都不能访问到Controller层方法。
2.拦截器的主要方法
preHandle()
:这个方法在
业务处理器处理请求之前被调用
,可以在此方法中做一些权限的校验。
如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle()
:这个方法在
业务处理器处理请求之后,渲染视图之前调用。
在此方法中可以对ModelAndView中的模型和视图进行处理。
afterCompletion()
:这个方法在 DispatcherServlet 完全处理完请求后被调用(即视图渲染完成之后),可以在该方法中进行一些资源清理的操作。
3.单个拦截器的实现
自定义的拦截器可以实现
HandlerInterceptor
接口,也可以继承
HandlerInterceptorAdapter
适配器类。
-
创建一个类实现
HandlerInterceptor
package com.atguigu.springmvc.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor的preHandle方法执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor的postHandle方法执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor的afterCompletion方法执行");
}
}
- 在SpringMVC的核心配置文件中配置拦截器
一下需要引入
mvc
名称空间
配置方式一
<!--配置拦截器-->
<mvc:interceptors>
<!--在interceptors中直接通过bean的方式配置interceptor,则默认全局拦截-->
<bean id="firstInterceptor" class="com.atguigu.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>
配置方式二
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--配置拦截的路径-->
<mvc:mapping path="/testInterceptor"/>
<!--配置不拦截的路径-->
<!--<mvc:exclude-mapping path="/testInterceptor"/>-->
<bean id="firstInterceptor" class="com.atguigu.springmvc.interceptors.FirstInterceptor"/>
</mvc:interceptor>
单个拦截器的执行流程
根据源码我们可以得出单个拦截器的执行流程如下:
4.配置多个拦截器
多个拦截器对同一个URL谁先进行拦截,由SpringMVC配置文件中配置的顺序决定。
多个拦截器对同一个URL谁先进行拦截,由SpringMVC配置文件中配置的顺序决定。
多个拦截器对同一个URL谁先进行拦截,由SpringMVC配置文件中配置的顺序决定。
package com.atguigu.springmvc.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor的preHandle方法执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor的postHandle方法执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("SecondInterceptor的afterCompletion方法执行");
}
}
- 在SpringMVC的核心配置文件中配置
<!--配置拦截器-->
<mvc:interceptors>
<!--在interceptors中直接通过bean的方式配置interceptor,则默认全局拦截-->
<bean id="firstInterceptor" class="com.atguigu.springmvc.interceptors.FirstInterceptor"/>
<mvc:interceptor>
<!--配置拦截的路径-->
<mvc:mapping path="/testInterceptor"/>
<!--配置不拦截的路径-->
<!--<mvc:exclude-mapping path="/testInterceptor"/>-->
<bean id="secondInterceptor" class="com.atguigu.springmvc.interceptors.SecondInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器的执行流程
所以我们看源码可以得出,多个拦截器的执行流程如下:
大家也可以看这张图
【引用原文链接】
【SSM – SpringMVC篇】09 SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别