概述

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

    实现过滤器必须要重写方法

  1. public class MyFilter implements Filter {
  2. public void init(FilterConfig filterConfig) throws ServletException {
  3. }
  4. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  5. }
  6. public void destroy() {
  7. }
  8. }

而拦截器不是必须要重写方法

  1. public class MyInterceptor implements HandlerInterceptor {
  2. }

自定义拦截器

那如何实现拦截器呢?
想要自定义拦截器,必须实现 HandlerInterceptor 接口。
1、新建一个Moudule——springmvc-07-Interceptor—— 添加web支持
2、配置web.xml 和 springmvc-servlet.xml 文件
3、编写一个拦截器

  1. package com.learn.config;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class MyInterceptor implements HandlerInterceptor {
  7. //return true; 执行下一个拦截器,放行
  8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  9. System.out.println("========处理前=========");
  10. return true;
  11. }
  12. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  13. System.out.println("========处理后=========");
  14. }
  15. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  16. System.out.println("========清理=========");
  17. }
  18. }

4、在spring-mvc.xml中配置拦截器

  1. <!--拦截器配置-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--包括这个请求下面的所有的请求-->
  5. <mvc:mapping path="/**"/>
  6. <bean class="com.learn.config.MyInterceptor"/>
  7. </mvc:interceptor>
  8. </mvc:interceptors>

5、写Controller方法

  1. @RestController
  2. public class TestController {
  3. @RequestMapping("/t1")
  4. public String test(){
  5. System.out.println("TestController执行了");
  6. return "ok";
  7. }
  8. }

6、启动Tomcat,访问http://localhost:8080/t1测试一下,查看控制台输出
拦截器 - 图1
7、总结

  1. 既然是拦截器,需要执行在方法之前,实现HandlerInterceptor接口的时候只需要重写preHandle()方法即可,其他两个方法都是用于输出日志的。
  2. preHandle()的返回值是bool类型,
  3. return true:才会放行,test方法才会执行
  4. return false:不放行,后面的方法不执行
  5. 了解配置文件/**的含义

案例:登录判断验证