HandlerInterceptor和HandlerExceptionResolver
上一篇博文介绍了HandlerExceptionResolver,全局try-catch 处理Controller里的异常。
而HandlerInterceptor实现Controller拦截,实现pre和post方法
- 首先HandlerInterceptor会执行代码1的preHandle方法,之后是方法2的preHandle
- 接下来执行controller的方法
- 然后顺序颠倒,方法2的后处理方法postHandle,方法1的后处理方法
- 然后执行controller返回的,servlet处理方法
- 最后执行方法2的afterCompletion,方法1的afterCompletion也就是所谓的最终处理
此处现象是拦截器做了2此处理拦截
- 在springmvc.xml配置 (此处需要配置2次,因为2个类需要执行拦截)
- 注册类实现了HandlerInterceptor接口并重写里面的方法
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 拦截具体的方法 -->
<mvc:mapping path="/user/**"/>
<!-- 不拦截的方法 -->
<!-- <mvc:exclude-mapping path=""/>-->
<!-- 配置拦截器对象 -->
<bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 拦截具体的方法 -->
<mvc:mapping path="/**"/>
<!-- 不拦截的方法 -->
<!-- <mvc:exclude-mapping path=""/>-->
<!-- 配置拦截器对象 -->
<bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
public class MyInterceptor1 implements HandlerInterceptor {
/**
* controller方法执行前
* return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
* return false 不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1执行了....前");
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return true;
}
/**
* 后处理方法,controller方法被执行后,success.jsp
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle1执行了....后");
// request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
}
/**
* success.jsp页面执行后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("最后一个处理方法 afterCompletion1...");
}
}