1、拦截器的作用
Spring MVC 的处理器拦截器类似于Servlet开发中的Filter,用于对处理器进行预处理和后处理。
用户可以自定义一些拦截器来实现特定的功能。
谈到拦截器,就想到——拦截器链。拦截器链就是将拦截器按一定的顺序链接成一条链。在访问被拦截的方法和字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
它与过滤器有几分相似,区别如下:
- 过滤器是servlet规范中的一部分,任何java web功能都可以使用。
- 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
- 过滤器是url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
- 拦截器它只是会拦截访问的控制器(@Controller)方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
它也是AOP思想的具体应用。
我们要想自定义拦截器,必须实现:HandlerInterception接口。
2、自定义拦截器的步骤
-
编写自定义拦截器类
public class MyInterceptor1 implements HandlerInterceptor { /** * 预处理,controller方法执行之前 * 返回true:放行,执行下一个拦截器或者controller方法 * 返回false:不放行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor1.preHandle 执行了...."); //如果当前出现问题,可以直接跳转到错误界面,返回false不执行controller方法 //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response); //return false return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor1.postHandle 执行了...."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor1.afterCompletion 执行了...."); } }
-
配置拦截器
在Springmvc.xml文件中:
<!--配置自定义拦截器--> <mvc:interceptors> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/user/*"/> <!--不要拦截的具体方法 <mvc:exclude-mapping path=""/> --> <!--配置拦截器对象--> <bean class="com.lin.interceptor.MyInterceptor1"/> </mvc:interceptor> </mvc:interceptors>
-
执行顺序如下
MyInterceptor1.preHandle 执行了.... testInterception执行了。。。 MyInterceptor1.postHandle 执行了.... success.jsp 执行了。。。 MyInterceptor1.afterCompletion 执行了....
3、使用拦截器链(多个拦截器)
-
增加自定义拦截器类
public class MyInterceptor2 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor2.preHandle 执行了...."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor2.postHandle 执行了...."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor2.afterCompletion 执行了...."); } }
-
配置多个拦截器
在Springmvc.xml文件中:
<!--配置自定义拦截器--> <mvc:interceptors> <!--配置第一个拦截器--> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/user/*"/> <!--不要拦截的具体方法 <mvc:exclude-mapping path=""/> --> <!--配置拦截器对象--> <bean class="com.lin.interceptor.MyInterceptor1"/> </mvc:interceptor> <!--配置第二个拦截器--> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/user/*"/> <!--不要拦截的具体方法 <mvc:exclude-mapping path=""/> --> <!--配置拦截器对象--> <bean class="com.lin.interceptor.MyInterceptor2"/> </mvc:interceptor> </mvc:interceptors>
-
执行顺序如下:
MyInterceptor1.preHandle 执行了.... MyInterceptor2.preHandle 执行了.... testInterception执行了。。。 MyInterceptor2.postHandle 执行了.... MyInterceptor1.postHandle 执行了.... success.jsp 执行了。。。 MyInterceptor2.afterCompletion 执行了.... MyInterceptor1.afterCompletion 执行了....