拦截器
实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。用于处理请求咱们Controller之前之后的的一些操作。
过滤器
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤
(拦截器既可以用于WEB,也可以用于Application、Swing中)
1 拦截器实现
主要步骤
- 定义拦截器:实现
HandlerInterceptor,重写方法 
- 注册拦截器:实现
WebMvcConfigurer,添加@Configuration 
- 定义拦截器
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   | import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;   import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;  
 
 
  public class MyInterceptor implements HandlerInterceptor{ 	      @Override     public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {         System.out.printf("preHandle被调用\n");         return true;        }            @Override     public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {         System.out.println("postHandle被调用\n");     }            @Override     public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {         System.out.println("afterCompletion被调用\n");     } }
   | 
 
- 注册拦截器
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | @Configuration public class MvcConfig implements WebMvcConfigurer {
      
 
  	@Override 	public void addInterceptors(InterceptorRegistry registry) { 		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/a.do");                   	}
  }
   | 
 
拦截的规则是支持通配符的,写法如下:
| 通配符 | 
说明 | 
* | 
匹配单个字符,如/user/*匹配到/user/a等,又如/user/*/ab匹配到/user/p/ab; | 
** | 
匹配任意多字符(包括多级路径),如/user/**匹配到user/a、/user/abs/po等; | 
上述也可以混合使用,如/user/po*/**、/user/{userId}/*(pathValue是可以和通配符共存的);
注:
- Spring boot 2.0 后
WebMvcConfigurerAdapter已经过时,所以这里并不是继承它,而是继承WebMvcConfigurer; 
- 这里在实操时,使用IDEA工具继承
WebMvcConfigurer接口时,使用快捷键Alt+Enter已经无论如何没有提示,进入查看发现这个接口中所有的方法变成了default方法(JDK8新特性,这个修饰符修饰的方法必须要有方法体,此时接口中允许有具体的方法,在实现该接口时,用户可以选择是否重写该方法,而不是必须重写了),所以没有提示,可以手动进入接口中复制对应的方法名(不包括default修饰符)。 
2 过滤器实现
SpringBoot中使用过滤器不需要在web.xml中配置filter,只需要
- 添加注解
@WebFilter 
- 实现
Filter接口 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | @Component @WebFilter(urlPatterns = "/*", filterName = "test") public class TestFilter implements Filter {   	@Override 	public void init(FilterConfig arg0) throws ServletException { 		System.out.println("过滤器初始化"); 	}   	@Override 	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 			throws IOException, ServletException { 		System.out.printf("过滤器实现"); 		System.out.println(((HttpServletRequest) servletRequest).getRequestURI()); 		filterChain.doFilter(servletRequest, servletResponse); 	}   	@Override 	public void destroy() { 		System.out.println("过滤器销毁了"); 	}   }
   | 
 
3 应用场景
可以参考:https://blog.csdn.net/xiaoyaotan_111/article/details/53817918
未完待续..
参考文献: