SpringMVC – 拦截器理解
Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置
定义一个拦截器可以通过两种方式
- 实现 HandlerInterceptor 接口继承 HandlerInterceptor 接口的实现类来定义
- 另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类
实现 HandlerInterceptor 接口
package com.springTest.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestInterceptor 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 个方法。这 3 个方法的描述如下。
- preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
- postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
SpringMVC配置文件中配置拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--springmvc扫包-->
<context:component-scan base-package="com.springTest.Controller"/>
<!--开启注解支持开发-->
<mvc:annotation-driven/>
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器作用的路径,扫全局 -->
<mvc:mapping path="/**" />
<!-- 配置不需要拦截作用的路径,放过登录 -->
<mvc:exclude-mapping path="/user/login" />
<!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="com.springTest.interceptor.TestInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
在上述示例代码中,
-
<mvc:interceptors> 元素用于配置一组拦截器,其子元素 定义的是全局拦截器,即拦截所有的请求。
-
<mvc:interceptor> 元素中定义的是指定路径的拦截器
-
子元素 <mvc:mapping> 用于配置拦截器作用的路径,该路径在其属性 path 中定义。
-
path 的属性值“/**”表示拦截所有路径,“/gotoTest”表示拦截所有以“/gotoTest”结尾的路径。如果在请求路径中包含不需要拦截的内容
-
<mvc:exclude-mapping> 子元素表示不拦截的请求。
需要注意的是,<mvc:interceptor> 元素的子元素必须按照 <mvc:mapping…/>、<mvc:exclude-mapping…/>、<bean…/> 的顺序配置。
效果
亲测,出了拦截器登录的请求,全局任何请求都会进拦截器,哪怕是默认请求,不过在配置文件中定义拦截使用比较少,因为拦截器有pre拦截,所以可以在一开始根据请求,定义true或者false就可以起到请求效果。
多重拦截就不再写了,效果都是一样的,写多个拦截器,和多个不拦截的拦截放行
直接上代码吧
原理就是:
进入第一个拦截一般用于注册登录,然后你想再拦截它一些东西,再定义一个拦截,由于我没有在类上面写@RequestMapping,所以只有一个根请求
/register。所以对于注册再拦截,然后bean里面定义的拦截,可以在对应的方法里面添加拦截即可