JavaWeb基础 – SpringMVC拦截器
1.拦截器
1.1 概念
SpringMVC内置了拦截器(interceptor),类似与Servlet的过滤器(Filter),主要功能是用于拦截用户请求并做相应处理。常见的拦截器主要用于拦截未登录的用户或权限不对应的操作。
2.拦截器使用
2.1 使用方式
拦截器一般通过实现HandleInterceptor接口,或者继承HandleInterceptor接口的实现类HandleInterceptorAdapter来定义。第二种方法是通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
2.2 拦截器定义
以下为通过实现HandleInterceptor接口为例
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//做一些操作 方法返回类型为布尔值
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//做一些操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//做一些操作
}
}
从定义过程来看,HandleInterceptor接口实现了三个方法,以下是对这三个方法的解释
- preHandle()方法:该方法会在Controller之前执行,返回值表示是否中断后续操作。返回true时执行后续操作,返回false时中断后续操作(包括调用下一个拦截器和控制器类中的方法执行等)。
- postHandle()方法:该方法在Controller之后调用,并在解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
- afterCompletion()方法:该方法会在请求完成后执行,即渲染视图之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
2.3 拦截器配置
通过在SpringMVC的配置文件中设置即可使拦截器生效
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 使用bean直接定义在<mvc:interceptors>下面的Interceptor将拦截所有请求 -->
<bean class="com.config.AllInterceptor"/>
<!-- 拦截器1 -->
<mvc:interceptor>
<!-- 配置拦截器作用的路径,/**表示拦截所有路径 -->
<mvc:mapping path="/**"/>
<!-- 配置不需要拦截器作用的路径 /admin表示放行所有以/admin结尾的路径 -->
<mvc:exclude-mapping path="/admin"/>
<!-- 定义在<mvc:interceptor>下面的Interceptor,表示对匹配路径的请求才进行拦截 -->
<bean class="com.config.AdminInterceptor"/>
</mvc:interceptor>
<!-- 拦截器2 -->
<mvc:interceptor>
<mvc:mapping path="/index/**"/>
<bean class="com.config.IndexInterceptor"/>
</mvc:interceptor>
<!-- 后面可以配置多个拦截器-->
</mvc:interceptors>
3.拦截器执行流程
3.1 简介
拦截器本身是按一定顺序执行的,该顺序与配置文件中定义的拦截器顺序有关。其执行顺序一般有两种情况,即单个拦截器和多个拦截器的情况。
- 单个拦截器:程序首先会执行拦截器类中的preHandle()方法,如果该方法返回true,则程序会继续向下执行处理器中的方法,否则程序将不再往下继续执行。在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应,在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
- 多个拦截器:当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()和afterCompletion()方法则会按照配置顺序的反序执行。