自定义的拦截器必须实现HandlerInterceptor接口
– preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对
请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件
去处理请求,则返回false。
* 该方法在目标方法之前被调用.
* 若返回值为 true, 则继续调用后续的拦截器和目标方法.
* 若返回值为 false, 则不会再调用后续的拦截器和目标方法.
* 可以考虑做权限. 日志, 事务等.
– postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对
用户请求request进行处理。
* 调用目标方法之后, 但渲染视图之前.
* 可以对请求域中的属性或视图做出修改.
– afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
* 渲染视图之后被调用. 释放资源
springmvc.xml
<mvc:interceptors> <!--配置自定义的拦截器--> <bean class="interceptor.FirstInterceptor"></bean> <mvc:interceptor> <mvc:mapping path="/emps"/> <bean class="interceptor.SecondInterceptor"></bean> </mvc:interceptor> <!--<!–配置LocaleChangeInterceptor–> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>--> </mvc:interceptors>
FirstInterceptor
package 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 FirstInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("FirstInterceptor preHandle"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("FirstInterceptor postHandle"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("FirstInterceptor afterCompletion"); } }
有两个拦截器时的执行顺序:
当第二个拦截器返回false时