一、表格数据
浏览器仅仅能提交GET 和 POST 请求。非浏览器可以使用 PUT、PATCH和DELETE。Servlet API 要求 ServletRequest.getParameter*() 方法仅仅支持POST表单数据通过。
spring-web 模块提供 FormContentFilter 去拦截 HTTP PUT 、PATCH和DELETE请求,请求的 content 的类型是 application/x-www-form-urlencoded,读取表单数据从请求体中,并且包装ServletRequest使表单数据能通过ServletRequest.getParameter*() 方法获取;
二、转发的请求头 forwarded headers
当请求通过代理(例如负载平衡器)时,主机、端口和模式可能会发生更改,这使得从客户端角度创建指向正确主机、端口和模式的链接成为一项挑战。
RFC 7239定义了 转发的HTTP头,代理可以使用它来提供关于原始请求的信息。还有其他非标准请求头,包括x - forward - host、x - forward - port、x - forward - proto、x - forward - ssl和x - forward - prefix。
ForwardedHeaderFilter 是一个Servlet过滤器,它根据 转发的HTTP头 修改请求的主机、端口和模式,然后删除这些头。
由于应用程序无法知道这些头是由代理(如预期的那样)添加的,还是由恶意客户机添加的,所以转发头需要考虑安全性。这就是为什么应该将位于信任边界的代理配置为删除来自外部的不受信任的转发头。您还可以使用removeOnly=true配置ForwardedHeaderFilter,在这种情况下,它删除但不使用头文件。
三、Shallow ETag
ShallowEtagHeaderFilter 过滤器根据响应中缓存的内容创建了一个 Shallow ETag,并从中计算MD5散列。下一次客户机发送时,它也会执行相同的操作,但是它还会将计算值与if - none - match请求头进行比较,如果两者相等,则返回304 (NOT_MODIFIED)。
这种策略节省了网络带宽而没有节省CPU,因为必须为每个请求计算完整的响应。前面描述的,控制器级的其他策略可以避免计算。
四、CORS 跨域资源共享
Spring MVC通过控制器上的注释为CORS配置提供了细粒度支持。然而,当与Spring Security一起使用时,我们建议依赖于内置的CorsFilter,该CorsFilter必须在Spring Security的过滤器链之前。