SpringMVC拦截器
拦截器的定义
自定义的拦截器需要实现一个接口HandlerInterceptor,并实现接口的三个方法:
public class UserHandlerInterceptor implements HandlerInterceptor {
/**
* 该方法在目标方法之前被调用
* 若返回值为true,则继续调用后续的拦截器和目标方法
* 若返回值为false,则不会再调用后续的拦截器和目标方法
* 可以考虑做权限、日志、事务等
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
return false;
}
/**
* 该方法在目标方法调用之后、在视图被渲染之前执行
* 可以对请求域中的属性或者视图做出修改
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
/**
* 该方法在渲染视图之后调用
* 可以释放资源
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
拦截器的配置
<mvc:interceptors>
<mvc:interceptor>
<!--可以配置拦截器作用路径-->
<mvc:mapping path="/login"/>
<!--可以配置拦截器不作用路径-->
<mvc:exclude-mapping path="/register"/>
<bean class="com.controller.Interceptor.UserHandlerInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器的执行顺序
假设有两个拦截器
1.第一个拦截器的preHandle()方法
2.第二个拦截器的preHandle()方法(如果返回false,直接到第一个拦截器的afterCompletion()方法)
3.HandlerAdapter#handle
4.第二个拦截器的postHandle()方法
5.第一个拦截器的postHandle()方法
6.DispatcherServlet
7.第二个拦截器的afterCompletion()方法
8.第一个拦截器的afterCompletion()方法