spring-web 模块提供了一些有用的 过滤器: Form Data Forwarded Headers Shallow ETag CORS
表单内容过滤器
一种对表单中的内容进行过滤的机制,用于防止恶意代码注入、XSS攻击等安全问题。
浏览器只能通过 HTTP GET 或 HTTP POST 提交表单数据,但非浏览器客户端也可以使用 HTTP PUT、PATCH 和 DELETE。 Servlet API 需要 ServletRequest.getParameter*() 系列方法来支持仅对 HTTP POST 的表单字段访问。 spring-web 模块提供了 FormContentFilter 来拦截内容类型为 applicationx-www-form-urlencoded 的 HTTP PUT、PATCH、DELETE 请求,从请求体中读取表单数据,并包装 ServletRequest 通过 ServletRequest.getParameter() 系列方法使表单数据可用。
转发过滤器
一种网络协议过滤器,用于在请求转发过程中对请求或响应进行过滤。用于实现安全策略,例如限制请求的来源、修改请求参数、添加响应头信息等。
当请求通过代理(如负载均衡器)时,主机、端口和方案可能会发生变化,这使得从客户端角度创建指向正确主机、端口和方案的链接成为一项挑战。
RFC 7239 定义了 Forwarded HTTP 头,代理可以使用它来提供有关原始请求的信息。还有其他非标准头,包括 X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto、X-Forwarded-Ssl 和 X-Forwarded-Prefix。 ForwardedHeaderFilter 是一个 Servlet 过滤器,它修改请求以便 a) 根据 Forwarded 头更改主机、端口和 scheme;b) 删除这些头以消除进一步的影响。该过滤器依赖于包装请求,因此它必须排在其他过滤器之前,例如 RequestContextFilter,它应该与修改后的请求一起使用,而不是原始请求。
Forwarded 头有安全考量,因为应用程序无法知道头是由代理按预期添加的,还是由恶意客户端添加的。这就是为什么应将信任边界处的代理配置为删除来自外部的不受信任的 Forwarded 头。还可以使用 removeOnly=true 配置 ForwardedHeaderFilter,在这种情况下它会删除但不使用头。
为了支持异步请求 和错误分派,此过滤器应使用 DispatcherType.ASYNC 和 DispatcherType.ERROR 进行映射。如果使用 Spring Framework 的 AbstractAnnotationConfigDispatcherServletInitializer(参见 Servlet Config),所有过滤器都会自动为所有调度类型注册。但是,如果通过 web.xml 或在 Spring Boot 中通过 FilterRegistrationBean 注册过滤器,请确保除了 DispatcherType.REQUEST 之外还包括 DispatcherType.ASYNC 和 DispatcherType.ERROR。
ETag 过滤器
ETag 过滤器是一种网络协议过滤器。它是 HTTP 协议规格说明定义的一种可以与 Web 资源关联的记号。 ShallowEtagHeaderFilter 过滤器通过缓存写入响应的内容并从中计算 MD5 哈希来创建“浅”ETag。下次客户端发送时,它会做同样的事情,但它还会将计算值与 If-None-Match 请求标头进行比较,如果两者相等,则返回 304 (NOT_MODIFIED)。 此策略节省网络带宽但不节省 CPU,因为必须为每个请求计算完整响应。前面描述的控制器级别的其他策略可以避免计算。
此过滤器有一个 writeWeakETag 参数(如 RFC 7232 Section 2.3 中所定义)。 为了支持异步请求,这个过滤器必须用 DispatcherType.ASYNC 映射,这样过滤器才能延迟并成功生成一个 ETag 到最后最后一次异步调度。如果使用 Spring Framework 的 AbstractAnnotationConfigDispatcherServletInitializer,所有过滤器都会自动为所有调度类型注册。但是,如果通过 web.xml 或在 Spring Boot 中通过 FilterRegistrationBean 注册过滤器,请确保包含 DispatcherType.ASYNC。
跨域过滤器
同样是一种网络协议过滤器,它用于限制或检查来自其他域的请求或响应。 Spring MVC 通过控制器上的注解为 CORS 配置提供细粒度支持。但是,当与 Spring Security 一起使用时,建议依赖内置的CorsFilter,它必须在 Spring Security 的过滤器链之前订阅。
跨域过滤器可以在一个安全上下文中实施跨域策略。例如,一个Web应用程序可能需要在浏览器中运行JavaScript,但这个应用程序需要从另一个不同的源获取数据。由于同源策略的限制,这个应用程序不能直接从那个源获取数据。然而,该应用程序可以通过跨域过滤器来请求数据。
跨域过滤器的工作方式是,它会在一个安全上下文中运行JavaScript代码,这个上下文被允许访问另一个源的数据。这个过滤器会处理所有的跨域请求和响应,确保只有符合安全策略的数据才能被接受。例如,它可以验证响应是否包含正确的CORS(跨源资源共享)头,或者它可能需要验证请求是否使用安全的协议(例如HTTPS)。
==注意:== 虽然跨域过滤器可以解决一些跨域问题,但它并不是解决所有问题的万能工具。例如,它不能解决浏览器的混合内容问题,这个问题阻止了某些类型的资源(例如ActiveX控件或插件)从不同的源加载。