过滤器

1、Filter 介绍(过滤器并不是拦截器,所以设置url模式只是过了这些模式的url进行特别处理,并不是不匹配的url就不能访问)
Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,比如实现 URL 级别的权限控制、过滤非法请求等等。Filter 过滤器是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。
 
2. Filter是如何实现拦截的?
Filter接口中有一个叫做 doFilter 的方法,这个方法实现了对用户请求的过滤。具体流程大体是这样的:
  1. 用户发送请求到 web 服务器,请求会先到过滤器;
  2. 过滤器会对请求进行一些处理比如过滤请求的参数、修改返回给客户端的 response 的内容、判断是否让用户访问该接口等等。
  3. 用户请求响应完毕。
  4. 进行一些自己想要的其他操作。
 
3、如何自定义Filter,下面提供两种方法(另外,为了能让 Spring 找到它,你需要在启动类上加上 @ServletComponentScan 注解;在配置中注册自定义的过滤器,通过FilterRegistrationBean 的setOrder 方法可以决定 Filter 的执行顺序,这样就可以有多个自定义过滤器)
3.1自己手动注册配置实现
自定义的 Filter 需要实现javax.Servlet.Filter接口,并重写接口中定义的3个方法-》在配置中注册自定义的过滤器。
3.2 通过提供好的一些注解实现
在自己的过滤器的类上加上@WebFilter 然后在这个注解中通过它提供好的一些参数进行配置。
 

拦截器

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程

你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置......

在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors(0或更多)。

Spring Interceptor是一个非常类似于Servlet Filter 的概念 。

2.过滤器和拦截器的区别

对于过滤器和拦截器的区别, 知乎@Kangol LI 的回答很不错。

  • 过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。
  • 拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。
 
3.自定义 Interceptor
如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter类,并且需要重写下面下面3个方法-》然后实现WebMvcConfigurer 接口的addInterceptors方法进行配置
public boolean preHandle(HttpServletRequest request,  HttpServletResponse response,  Object handler)
public void postHandle(HttpServletRequest request,     HttpServletResponse response,      Object handler,    ModelAndView modelAndView)
public void afterCompletion(HttpServletRequest request,       HttpServletResponse response,        Object handler,          Exception ex)
注意: preHandle方法返回 true或 false。如果返回 true,则意味着请求将继续到达 Controller 被处理。每个请求可能会通过许多拦截器