java - Tomcat 对二进制文件的 POST 请求随机返回 401
问题描述
我在前端运行一个backbone.js 应用程序,在Tomcat 9 上运行Spring boot (2.13) 应用程序作为后端。我们正在使用 OpenJDK Java 11。(Corretto)我的所有其他请求(GET 和 POST)都有效。只有两个上传二进制文件的POST请求有时会返回401。我们在后端日志中没有看到任何尝试不成功的内容,只有Tomcat访问日志显示401。请求立即失败。在 Chrome 中检查请求显示它们看起来相同 - 相同数量的标头和相同的值。
成功的请求看起来像这样
[2019 年 12 月 3 日:13:49:49 +0100] 172.30。. - **用户CN=*****, O=****, C=** "POST /rest/taxUpload HTTP/1.1" 200 61 "https://*********. eu/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
不成功的请求看起来像这样 - 访问日志中总是有两行
[2019 年 12 月 3 日:13:50:13 +0100] 172.30。. - **用户- "POST /rest/taxUpload HTTP/1.1" 401 1099 "https://*********.eu/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/ 537.36(KHTML,如 Gecko)Chrome/78.0.3904.108 Safari/537.36"
[03/Dec/2019:17:13:40 +0100] 172.30.***.* - --- - "null null HTTP/1.1" 400 2297 "-" "-"
对同一个文件、同一个浏览器、同一个用户提出了请求。我们使用 Tomcat 上的 DataSource Database Realm 进行身份验证,我们尝试了 TLS1.1、TLS1.2、Tomcat 8.5、不同的浏览器、Tomcat 中 SSL 连接器上的所有缓存和超时设置。
正在发送的标头
POST /rest/taxUpload HTTP/1.1
主持人:****.net
连接:保持活动
内容长度:160093
接受:/
来源:https://*****.net
X-CSRF-TOKEN:344f5e99-b5e5-49c1-8711-27de638dd739
X-Requested-With: XMLHttpRequest
用户代理:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
内容类型:multipart/form-data;边界=---- WebKitFormBoundaryo5NZhRls0pjEqx8Z
Sec-Fetch-Site:同源
Sec-Fetch-Mode: cors
参考:https://******.net/
接受编码:gzip、deflate、br
接受语言:en-US,en;q=0.9
曲奇:_ga=GA1.2.1549123445.1568710333;CSRF-TOKEN=344f5e99-b5e5-49c1-8711-27de638dd739
Tomcat 服务器.xml
<Connector port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="250"
scheme="https"
xpoweredBy="false"
server="****"
disableUploadTimeout="true"
maxSavePostSize="4096"
clientAuth="false"
keyAlias="default"
keyPass="***"
keystoreFile="***/default.jks"
keystorePass="****"
keystoreType="JKS"
sslProtocol="TLS"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"
sslEnabledProtocols="TLSv1.2+TLSv1.1+TLSv1"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
truststoreFile="***.jks"
truststorePass="****"
truststoreType="JKS"
secure="true"
relaxedQueryChars="[,]"
acceptCount="250"
acceptorThreadCount="2"
compression="on"/>
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/authority"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" localDataSource="true"/>
解决方案
推荐阅读
- apache-kafka - Debezium MySQL 连接器 - io.debezium.text.ParsingException
- android - Firebase 依赖项:“警告:API 'variant.getMergeResources()' 已过时并已被替换”
- node.js - 提交用户输入的发布请求时出现 403 错误
- docker - 找不到指定的 Dockerfile:上下文/Dockerfile - Pipeline Bitbucket
- c# - 如何在 html 下拉列表中绑定 xml deatils
- javascript - tagit:更改标签的值
- javascript - 点击上传图片并拖放
- ionic-framework - 成功执行“ionic cordova build android”命令后未找到 APK
- php - 如何使用 Laravel 从数据库中检索图像
- delphi - 如何将 MySQL Blob 字段转换为插入语句的字符串