【Spring Boot】过滤器 Filter 🔥

2,119 阅读1分钟

过滤器

javax.servlet.Filter

并非spring的专属,早期的web.xml中经常会看到过滤器的身影,大多数基于servlet的框架都可以使用过滤器(依赖于servlet容器,基于函数回调)。

举例

@Component
public class TokenSignFilter implements Filter {

    @Override
    public void doFilter(
        ServletRequest req,
        ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        // path like '/hello'
        final String path = request.getServletPath();
        // ...
    }
}

Spring Boot中自定义了很多过滤器,来统一处理servlet的操作。比如CharacterEncodingFilter来处理字符编码问题。

在自定义过滤器时,需要注意以下的原则:

  1. 单一职责;
  2. @Ordered注意类的执行顺序,有时候很重要;
  3. requestbody(InputStream)如果被读取了,那么在controller中会获取不到;
  4. 如果出现错误,不要直接抛出异常,而是response设置后返回,@ExceptionHandler是无法捕获到Filter中抛出的异常的。

其他

场景

可以对几乎所有请求进行过滤,但是一个过滤器实例只能在容器初始化时调用一次。

  1. 对传入的request、response提前过滤掉一些信息;
  2. 提前设置一些参数;
  3. 统一的一些操作,比如签名、XSS、字符编码等;