springmvc通过使用拦截器来对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义拦截器必须实现HandlerInterceptor接口。里面有三个方法:
1、preHandle:这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求的request进行处理,如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器都去进行处理,则返回true,如果程序员决定不需要再调用其他的组建去处理请求,则返回false。
2、posthandle:这个方法在业务处理器处理完成请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求的request进行处理。
3、afterCompletion:这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
拦截器的执行顺序:
当配置多个拦截器的时候的执行顺序:
我们举例说明一下:
在springmvc.xml中配置拦截器
<mvc:interceptors> <!-- 配置自定义的拦截器 --> <bean class="com.atguigu.springmvc.interceptors.FirstInterceptor"></bean>
<!-- 配置拦截器(不)作用的路径 --> <mvc:interceptor> <mvc:mapping path="/emps"/> <bean class="com.atguigu.springmvc.interceptors.SecondInterceptor"></bean> </mvc:interceptor>
<!-- 配置 LocaleChanceInterceptor --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors> |
具体的类的代码,这里仅仅列举上面的SecondInterceptor的类:
package com.atguigu.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 SecondInterceptor implements HandlerInterceptor{
/** * 该方法在目标方法之前被调用. * 若返回值为 true, 则继续调用后续的拦截器和目标方法. * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. * * 可以考虑做权限. 日志, 事务等. */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("[SecondInterceptor] preHandle"); return false; }
/** * 调用目标方法之后, 但渲染视图之前. * 可以对请求域中的属性或视图做出修改. */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("[SecondInterceptor] postHandle"); }
/** * 渲染视图之后被调用. 释放资源 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("[SecondInterceptor] afterCompletion"); }
} |
拦截器,这种AOP思想的东东,做切面还是很方便的。