过滤器

63 阅读3分钟

对于每个调用链,第一个过滤器都会被自动调用。当一个请求到达时,Servlet 容器会根据 URL 映射和过滤器配置来确定使用哪个过滤器链,然后按照该链的顺序依次调用每个过滤器的 doFilter() 方法。

因此,每个调用链都有自己的第一个过滤器,它们会在请求到达时自动被调用。这样可以确保每个请求都经过了预先配置的过滤器链,进行统一的处理。

如果一个过滤器是过滤器链中的第一个过滤器,那么它就是请求的第一个处理者,也就是说它是请求的入口。在这种情况下,通常不需要显式地调用它,而是由 Servlet 容器在接收到请求后自动调用它。

当一个请求到达时,Servlet 容器会按照过滤器链的顺序依次调用每个过滤器的 doFilter() 方法。第一个过滤器的 doFilter() 方法会在请求的最开始被调用,它可以执行一些初始化操作,然后调用过滤器链中的下一个过滤器,或者如果没有下一个过滤器了,则传递给目标 Servlet 或 Controller 进行处理。

因此,对于过滤器链中的第一个过滤器来说,它会在请求到达时被自动调用,而不需要显式地进行调用。

这段代码是一个过滤器,主要用于对请求进行 XSS(跨站脚本攻击)过滤。以下是逻辑的解析:

  1. @WebFilter@Component 注解表明这是一个过滤器,并且被 Spring 容器管理。

  2. doFilter() 方法是过滤器的主要逻辑,它处理了对请求的过滤操作。具体逻辑如下:

    a. 首先,获取到 HttpServletRequest 对象和请求的 URL 路径。

    b. 定义了两个数组:

    • exclusionsUrls:包含了一些要被忽略的请求路径,不对这些路径下的请求进行 XSS 过滤。
    • richTextUrls:包含了带有富文本内容的接口路径,需要进行特殊处理。

    c. 创建了一个 XssAndSqlHttpServletRequestWrapper 对象,这是一个自定义的请求包装器,用于进行 XSS 和 SQL 注入过滤。

    d. 遍历 exclusionsUrls 数组,如果请求的 URL 路径包含在其中,说明这个请求不需要进行 XSS 过滤,则直接调用原始的过滤器链(filterChain.doFilter()),并返回。

    e. 再遍历 richTextUrls 数组,如果请求的 URL 路径包含在其中,说明这个请求是带有富文本内容的接口,需要进行特殊处理,这里调用了 XssAndSqlHttpServletRequestWrapper 进行过滤。

    f. 如果以上两种情况都不满足,说明这个请求需要进行一般的 XSS 过滤。创建 XssHttpServletRequestWrapper 对象,并调用过滤器链进行过滤。

  3. init()destroy() 方法留空,这两个方法是过滤器生命周期中的初始化和销毁方法。

总的来说,这个过滤器的逻辑比较清晰:它根据请求的路径来决定是否需要进行 XSS 过滤,并使用了两种不同的 XSS 过滤方式。

过滤器链 过滤器链执行顺序

多条过滤器链

第一条过滤器如何调用