自定义拦截器
1. 实现HandlerInterceptor
拦截器接口
- preHandle 方法: 在执行目标方法之前调用,放回false将结束执行流程
- postHandle 方法: 在调用目标方法后,渲染视图前执行
- afterCompletion 方法: 在渲染视图后执行
public class FirstIntercept implements HandlerInterceptor {
/**
* 该方法在目标方法之前被调用.
* 若返回值为 true, 则继续调用后续的拦截器和目标方法.
* 若返回值为 false, 则不会再调用后续的拦截器和目标方法.
*
* 可以考虑做权限. 日志, 事务等.
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("preHandle");
//返回 false 将不会执行后续代码
return false;
}
/**
* 调用目标方法之后, 但渲染视图之前.
* 可以对请求域中的属性或视图做出修改.
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/**
* 渲染视图之后被调用. 释放资源
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
2. 编写配置文件
在 springmvc 的配置文件中配置拦截器
<mvc:interceptors>
<!--自定义拦截器-->
<bean class="com.maven.interceptors.FirstIntercept" id="firstIntercept"/>
</mvc:interceptors>
拦截器配置
可配置拦截需要拦截的链接和不拦截的链接
<mvc:interceptors>
<!--自定义拦截器-->
<bean class="com.maven.interceptors.FirstIntercept"/>
<mvc:interceptor>
<!--包含的路径-->
<mvc:mapping path="/test"/>
<!--不包含的路径 顺序不能颠倒 -->
<mvc:exclude-mapping path="/login"/>
<bean class="com.maven.interceptors.SecondInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器组顺序
- preHandle 方法: 按配置的顺序执行
- postHandle 方法: 按配置的逆序执行
- afterCompletion 方法: 按配置的逆序执行
注 : 当在执行流程途中preHandle
方法返回false
的时候,前面执行过preHandle
方法的拦截器要逆序执行afterCompletion
方法