SpringMVC 拦截器
拦截器 interceptor 作用
Spring MVC的拦载器类似于Serlet开发中的过滤器Filter,用于对处理器进行预处理和后处理
将拦截器按一定的顺序联结成一条链, 这条链称为拦截器链(Interceptor Chain) 。在访问被拦截的方
法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
拦截器和过滤器区别
区别 | 过滤器 | 拦截器 |
---|---|---|
使用范围 | 是servlet规范中的一部分,任何 Java Web工程都可以使用 | 是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用 |
拦截范围 | 在url-pattern中配置了/之后,可以对所有要访问的资源拦截 | 只会拦截访问的控制器方法,如果访问的是jsp,html,css,image 或者 js 是不会进行拦截的 |
快速入门
-
常见拦截器类实现 HanderInterceptor 接口
public class MyInterceptor1 implements HandlerInterceptor { //在目标方法执行之前执行 //如果返回 false,后面就不能被执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); String param = request.getParameter("param"); System.out.println(param); if(param.equals("yes")){ //放,执行各种其他逻辑 }else{ //return false; } return true;//返回 true 代表方向,反之一样。 } //在目标执行之后,视图返回之前执行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } //整个流程执行之后执行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); } }
-
配置拦截器
<mvc:interceptors> <mvc:interceptor> <!--代表对哪些资源进行拦截操作--> <mvc:mapping path="/**"/> <!--哪些资源排除拦截操作--> <mvc:exclude-mapping path="/user/login"/> <bean class="com.main.interceptor.MyInterceptor1 "/> </mvc:interceptor> </mvc:interceptors>
-
测试拦截器效果
拦截器方法说明
方法名 | 说明 |
---|---|
preHandle() | 方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的, 当它返回为false时,表示请求结束,后续的Interceptor 和Controller都不会 再执行:当返回值为true时就会继续调用下一个Interceptor 的preHandle方 法 |
postHandle() | 该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为 true时才能被调用,且它会在DispatcherServlet 进行视图返回消染之前被调 用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象 进行操作 |
afterCompletion() | 该方法将在整个请求结束之后,也就是在DispatcherServlet 直染了对应的视恩 之后执行,前提是preHandle方法的返回值为true时才能被调用 |