一、关于自定义拦截器
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
– preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
– postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
– afterCompletion():这个方法在DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
二、拦截器方法执行顺序
三、实现自定义拦截器
四、其他配置1、实现HandlerInterceptor接口,实现三个方法
package com.weixuan.springmvc.interceptors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class FirstInterceptors implements HandlerInterceptor{ /** * 该方法在目标方法之前被调用. * 若返回值为 true, 则继续调用后续的拦截器和目标方法. * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. * * 可以考虑做权限. 日志, 事务等. */ @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object obj) throws Exception { System.out.println(" [preHandle] "); return true; } /** * 渲染视图之后被调用. 释放资源 */ @Override public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object obj, Exception e) throws Exception { System.out.println(" [afterCompletion] "); } /** * 调用目标方法之后, 但渲染视图之前. * 可以对请求域中的属性或视图做出修改. */ @Override public void postHandle(HttpServletRequest req, HttpServletResponse res, Object obj, ModelAndView ma) throws Exception { System.out.println(" [postHandle] "); } }
2、在配置文件里面配置自定义拦截器
<!-- 配置自定义拦截器 --> <mvc:interceptors> <bean class="com.weixuan.springmvc.interceptors.FirstInterceptors"></bean> </mvc:interceptors>
五、多个拦截器的执行顺序<mvc:interceptors></mvc:interceptors>里面还可以配置一个 <mvc:interceptor></mvc:interceptor>结点
<!-- 配置自定义拦截器 --> <mvc:interceptors> <bean class="com.weixuan.springmvc.interceptors.FirstInterceptors"></bean> <mvc:interceptor> <!-- 配置作用路径,也可以是不作用的路径 <mvc:exclude-mapping path=""/> --> <mvc:mapping path="/emps"/> <bean class="com.weixuan.springmvc.interceptors.SecondInterceptors"></bean> </mvc:interceptor> </mvc:interceptors>
都返回true
first 返回false,只执行firstinterceptor的pre方法
first true,second false