如何自定义拦截器?
1. 编写拦截器类,实现 HandlerInterceptor 接口
该接口有以下3个方法:
- preHandle():该方法在目标方法之前被调用。若返回值为 true,则继续调用后续的拦截器和目标方法;若返回值为 false,则不会再调用后续的拦截器和目标方法。用途:可以考虑做权限、日志、事务等
- postHandle():调用目标方法之后,但在渲染视图之前。用途:可以对请求域中的属性或视图做出修改
- afterCompletion():渲染视图之后被调用。用途:释放资源
public class FirstInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("[FirstInterceptor] preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[FirstInterceptor] postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[FirstInterceptor] afterCompletion");
}
}
2. 在 Spring MVC 配置文件中注册这个拦截器
<mvc:interceptors>
<bean class="com.atguigu.springmvc.interceptors.FirstInterceptor"/>
</mvc:interceptors>
拦截器的配置
mvc:interceptors 节点下有一个 mvc:interceptor 节点,不仅能注册一个拦截器,还可以对拦截器进行一些配置
- mvc:mapping:配置拦截器生效的路径
- mvc:exclude-mapping:配置拦截器不生效的路径
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.atguigu.springmvc.interceptors.SecondInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器的执行顺序
- 配置顺序:
<mvc:interceptors>
<bean class="com.atguigu.springmvc.interceptors.FirstInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.atguigu.springmvc.interceptors.SecondInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- 执行顺序: