SpringMVC 拦截器
允许运行目标方法之前进行一些拦截工作, 或者目标方法运行之后进行一些其他处理
拦截器接口: HandlerInterceptor
- 在请求整个完成之后; 来到目标页面之后; chain.doFilter()放行;资源响应之后
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex)
- 在目标方法运行之后调用: 目标方法调用之后
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView)
- 在目标方法运行之前调用: return true; == (chain.doFilter())放行, return false; 不放行
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
自定义拦截器:
- 实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandler...");
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...");
}
}
- 在SpringMVC配置文件中注册这个拦截器的工作
配置这个拦截器拦截哪些请求
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 配置某个拦截器, 默认拦截所有请求 -->
<bean class="com.xian.controller.MyInterceptor"></bean>
<!-- 配置拦截器更详细的信息 -->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.xian.controller.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
- 拦截器运行流程:
正常流程: preHandle —> 目标方法 —> postHandle —> 页面 —> afterCompletion;
其它流程:
- 只要preHandle不放行就没得以后的流程
- 只要某个拦截器的preHandle放行了, 这个拦截器的afterCompletion都会执行
- 多个拦截器下:
拦截器的preHandle: 按顺序执行
拦截器的postHandle: 按逆序执行
拦截器的afterCompletion: 按逆序执行
当第一个拦截器的preHandle通过, 第二个preHandle未通过时, 它会跳过后面的流程, 但是第一个拦截器的afterCompletion依然会执行: