主流框架【第11期】--SpringMVC拦截器
主流框架【第11期】--SpringMVC拦截器
导读:
大家好,我是老田。今天我们梳理SpringMVC的拦截器实现。Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理。
1.拦截器
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,主要有以下 2 种方式。
通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类(例如 HandlerInterceptorAdapter)来定义;
通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。
2.拦截器定义
以实现 HandlerInterceptor 接口的方式自定义拦截器
package com.tian.demo.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class DemoInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法在控制器的处理请求方法调用之前执行");
return false;
}
}
HandlerInterceptor 接口的 3 个方法说明如下:
preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
3.拦截器的配置
拦截器在SpringMVC中的配置如下:
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置一个全局拦截器,拦截所有请求 -->
<bean class="com.tian.demo.interceptor.DemoInterceptor" />
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**" />
<!-- 配置不需要拦截作用的路径 -->
<mvc:exclude-mapping path="/login.do" />
<!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="com.tian.demo.interceptor.DemoInterceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/demo2" />
<!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="com.tian.demo.interceptor.DemoInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
在上述示例代码中,元素说明如下。
<mvc:interceptors>
:该元素用于配置一组拦截器。<bean>
:该元素是<mvc:interceptors>
的子元素,用于定义全局拦截器,即拦截所有的请求。<mvc:interceptor>
:该元素用于定义指定路径的拦截器。<mvc:mapping>
:该元素是<mvc:interceptor>
的子元素,用于配置拦截器作用的路径,该路径在其属性 path 中定义。path 的属性值为/**
时,表示拦截所有路径,值为/demo2时,表示拦截所有以/demo2结尾的路径。如果在请求路径中包含不需要拦截的内容,可以通过<mvc:exclude-mapping>
子元素进行配置。
需要注意的是,
<mvc:interceptor>
元素的子元素必须按照<mvc:mapping.../>
、<mvc:exclude-mapping.../>
、<bean.../>
的顺序配置。
博观而约取,厚积而薄发!
--END--