首页 > 解决方案 > 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"/>

标签: javahttpssltomcat

解决方案


推荐阅读