在h5的app进行网络请求struts2 (版本6.1.1)框架对外的服务
在struts2 框架的底层使用了是否是同源校验(使用了拦截器FetchMetadataInterceptor )
拦截器中判断了是否是同源请求(get请求会直接放过),出现问题的是POST请求。


由上图可以看到,struts2 会从请求头中获取"Sec-Fetch-Site" 的值进行判断,使用Tengine代理struts2 框架后问题就出在这里。
使用Tengine代理服务后(此处是https的代理,http没有验证),由于安全性要求,Tengine会给请求头拼接上几个参数(Nginx 不会主动去拼接)
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: cross-site
在struts2 的拦截器中取出sec-fetch-sit, 发现是cross-site, 且不是get请求,会直接返回403
解决方式
临时修复方法是在Tengine 的配置文件(在server 或者location 的配置属性中覆盖配置)中添加如下配置进行覆盖,把请求头中的这三个参数置空
proxy_set_header Sec-Fetch-Dest "";
proxy_set_header Sec-Fetch-Mode "";
proxy_set_header Sec-Fetch-Site "";
到此请求能够正常访问到接口,而不被拦截器给过滤