java - POST REST API 调用不适用于 Chrome 浏览器,但适用于 IE 浏览器
问题描述
我们有一个 Web 应用程序,UI 托管在一台主机上的一台 Apache 服务器上,后端 REST API 服务托管在不同主机上的 tomcat 服务器上。对于 UI:使用 Node.js,它托管在 Apache 对于 API:Java 8,使用 Spring REST,war 文件托管在 tomcat 8.5.32
问题:
在对所有 POST API 调用使用 Chrome 浏览器(版本:71.0.3578.80)时,服务器以错误代码 403(禁止)响应,但对于 IE 浏览器(版本 11.0.105),相同的 POST API 返回状态为 200(成功)的响应. 对于所有 POST 请求,都会观察到上述行为。
以下是 chrome 浏览器的请求和响应标头:
请求标头:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 6559
Content-Type: application/json
Cookie: <cookies>
Host: <myhost>.com
Origin: https://<myhost>.com
Referer: https://<myhost>.com/beta/
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
响应标头:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://<myhost>.com
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/plain
Date: Mon, 11 Feb 2019 11:49:25 GMT
Keep-Alive: timeout=5, max=95
Server: Apache
Strict-Transport-Security: max-age=31536000
API 调用一般细节:
Request URL: https://<myhost>.com/services/v1/settings
Request Method: POST
Status Code: 403
Remote Address: <ip address>:443
Referrer Policy: no-referrer-when-downgrade
请求有效载荷:
{"userId":"test", "someFlag": "someValue"}
你能帮助理解我在上面的标题中缺少什么吗?
发现:
如果我们从 8.5.32 版本恢复到 tomcat 8.5.29 版本,那么 POST API 请求调用在所有浏览器上都可以正常工作。
我还发现 Tomcat 8.5.32 对 https://tomcat.apache.org/security-8.html#Fixed_in_Apache_Tomcat_8 .5.32 进行了修复:低:CORS 过滤器具有不安全的默认值CVE-2018-8014,这可能会导致此问题问题,但我无法弄清楚确切的问题以及我应该做哪些标题更改才能让这个 POST 请求在 Chrome 浏览器上工作。
解决方案
推荐阅读
- rust - Rust 特征字段生命周期
- python - 我应该在 try-except 中包含验证函数并重新引发异常吗?
- ruby-on-rails - Rails - problema con il salvataggio di un array tramite check_boxes
- r - 制作具有多个 y 值的 ggplot 图表
- python - 当我按下一个调用更新我的数据库的方法的按钮时,Python Shell 崩溃
- git - Git 从另一个存储库中将更改拉入单一存储库
- terminal - 在被其他进程重新启动之前,无法从终端读取数据
- python - 为什么我在 MacOSX 终端中收到 NameError?
- ios - 如何在表格视图单元格中快速处理多个文本字段
- mongodb - 对 Get 请求的空数组响应