拦截器(Interceptor)是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。
在 Spring MVC 中,拦截器的作用与 Servlet 中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。
Spring MVC 拦截器使用的是可插拔式的设计,如果我们需要某一拦截器,只需在配置文件中启用该拦截器即可;如果不需要这个拦截器,则只要在配置文件中取消应用该拦截器即可。
想要在 Spring MVC 项目中使用拦截器,第一步就是要对拦截器类进行定义。
Spring MVC 在 org.springframework.web.servlet 包中提供了一个 HandlerInterceptor 接口,该接口包含 3 个方法,如下表。
| 方法名 | 返回值 | 说明 |
|---|---|---|
| preHandle () | boolean | 该方法在控制器方法之前执行,其返回值用来表示是否中断后续操作。
|
| postHandle () | void | 该方法会在控制器方法调用之后,解析式图之前执行。我们可以通过此方法对请求域中的模型(Model)数据和视图做出进一步的修改。 |
| afterCompletion () | void | 该方法会在整个请求完成后,即视图渲染结束之后执行。我们可以通过该方法实现资源清理、日志记录等工作。 |
通过实现 HandlerInterceptor 接口,重写其方法,来实现对拦截器类的定义,示例代码如下。
-
- public class MyInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("preHandle 执行");
- return true;
- }
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("postHandle 执行");
- }
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("afterCompletion 执行");
- }
- }
在定义完拦截器后,我们还需要在 Spring MVC 的配置文件中使用
在 Spring MVC 的配置文件中,
| 标签 | 一级子标签 | 二级子标签 | 说明 |
|---|---|---|---|
| - | |||
| - | |||
| | |||
在 Spring MVC 的配置文件中,通过
- <mvc:interceptors>
- <bean class="com.cky.interceptor.MyInterceptor">bean>
- mvc:interceptors>
除了
- <bean id="interceptor" class="com.cky.interceptor.MyInterceptor">bean>
- <mvc:interceptors>
-
- <ref bean="interceptor">ref>
- mvc:interceptors>
注意:
还可以在 Spring MVC 的配置文件中通过
- <mvc:interceptors>
-
- <mvc:interceptor>
-
- <mvc:mapping path="/**"/>
-
- <mvc:exclude-mapping path="/login"/>
- <mvc:exclude-mapping path="/"/>
-
- <bean class="com.cky.interceptor.MyInterceptor">bean>
- mvc:interceptor>
- mvc:interceptors>
需要注意的是,在 → → 的顺序,否则就会报错。其次,以上这三种配置拦截器的方式,我们可以根据自身的需求以任意的组合方式进行配置,以实现在
拦截器的执行流程如下图所示。
拦截器处理流程的步骤如下: