SpringMVC中提供的一些Filter
FormContentFilter#
默认情况下,在提交那些具有请求体,并且ContentType=application/x-www-form-urlencoded
的HTTP请求时,request.getParameter
系列方法只能在请求方法为POST时正确获得请求体中的参数,也就是说对于PUT这类请求,它压根不解析请求体中的参数。
下面的Controller获取请求体中的param
参数,并连同请求方法一同打印出来:
@RequestMapping(method = {RequestMethod.POST, RequestMethod.PUT}, path = "/hello")
public String hello(HttpServletRequest request) {
System.out.println("method: " + request.getMethod()
+ ", param: " + request.getParameter("param"));
return "helloPage";
}
下面我们分别用POST和PUT请求它:
可以看到POST的接收到了参数,PUT的没接收到。
FormContentFilter
返回请求对象的一个代理,让在非POST请求的情况下,getParameter
系列方法也能正确的返回:
下面添加FormContentFilter
:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] {new FormContentFilter()};
}
}
现在,两个请求方法都能接收到参数:
ForwardedHeaderFilter#
当你使用反向代理服务器时,你的后端代码可能需要获取到请求的原始URL。
比如,客户端通过反向代理服务器172.25.3.164
来访问后端服务器:
你希望获取到客户端请求的原始URL,也就是http://172.25.3.164/hello
,而后端服务器获取到的却是:
这是因为我们的服务端收到的实际是反向代理发过来的请求,已经不是客户端的原始请求了。
这可以用HTTP头中的X-Forwarded-Host
和X-Forwarded-Port
来识别。
ForwardedHeaderFilter
的作用就是找出头中所有这些和反向代理服务器相关的Forward
头,然后将对应的值设置到一个代理request对象中,并且把这些Forward
头清除掉。下面我们配置ForwardedHeaderFilter
:
@Override
protected Filter[] getServletFilters() {
return new Filter[] {new ForwardedHeaderFilter()};
}
重新运行,服务端已经拿到了客户端的原始请求:
ForwardedHeaderFilter
侦测的头列表:
FORWARDED_HEADER_NAMES.add("Forwarded");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Host");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Port");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Proto");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Prefix");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Ssl");
ShallowEtagHeaderFilter#
先说ETag的作用。
ETag是HTTP1.1中提供的头字段,服务器端针对一些不经常变动的并且较大的资源计算一个ETag值,并返回给前端。前端接收到内容后缓存内容和ETag。下次请求时,客户端在请求头中添加If-Match
或If-None-Match
字段,并将Etag作为字段的值。服务器端检测这个ETag并通过它计算用户请求的文件是否修改过,若没修改过直接返回304,客户端接到了就知道使用本地缓存就行,这免去了整个文件的传输。
配置ShallowEtagHeaderFilter
:
@Override
protected Filter[] getServletFilters() {
return new Filter[] {new ShallowEtagHeaderFilter()};
}
第一次访问,服务端返回200,并在头中返回etag:
第二次访问,客户端携带了If-None-Match
头,并在头中添加了上次的Etag,同时服务端返回304:
CorsFilter#
提供Cors支持,略
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/16511761.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
2021-07-23 你不知道的JavaScript——异步编程(上)传统回调模式