【问题标题】:Apache Tomcat upgrade to 8.5.51 causes 400 errorsApache Tomcat 升级到 8.5.51 导致 400 错误
【发布时间】:2020-09-10 20:04:24
【问题描述】:

将 Tomcat 从 8.5.50 升级到 8.5.51 时遇到问题。自从迁移到此版本后,发送到 http 端口的请求失败并显示 400 错误代码(错误请求)。 server.xml 配置为将 http 端口重定向到 https 端口。这已经工作了多年,直到升级才开始失败。下面是连接器配置和用于向服务器发送测试事务的 java 类。

我已经搜索了更改日志,我看到的唯一可能导致此问题的更改是针对错误 63966 的错误修复 - TLS 消息的字符集被硬编码为 ISO-8859-1。此错误修复已引入 8.5.51。我认为这可能是原因是当我们将此请求发送到 tomcat 8.5.50 时,回复 Content-Type 将如下所示:

内容类型:text/plain;charset=ISO-8859-1

使用 tomcat 8.5.51,我得到了这个: 内容类型:text/html;charset=utf-8

任何想法为什么我在升级到 8.5.51 及更高版本时收到 400 错误?

连接器配置:

<Connector port="5555" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="7777"
                />
 
       <Connector port="7777" protocol="HTTP/1.1" SSLEnabled="true"
           scheme="https" secure="true"             ciphers="TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
           clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2"
           keyAlias="myKey"
           keystore="NONE"
           keystorePass="password"
           keystoreType="PKCS11"
           keystoreProvider="myprovider"
           enableLookups="false"
           server="server"
           "/>

用于发送测试事务的Java类:

package com.testing;
 
import java.io.*;
import java.net.*;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
 
public class RunTestTran{
 
    public  RunTestTran() {
    }
 
    public static void main(String [] args){
        RunTestTran recordProcessorTest = new RunTestTran();
        recordProcessorTest.runTran("localhost", 5555, "/requestProcessor/rp");
    }
 
        private void runTran(String ip, int port, String appName){
                Socket socket = null;
                PrintWriter out = null;
                BufferedReader in = null;
                String dataToSend = "";
 
                //Create socket connection
                try {
                        socket = new Socket(ip, port);
                        out = new PrintWriter(socket.getOutputStream(), true);
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                } catch  (Exception e) {
                        System.out.println("Exception:" + e.toString() );
                        System.exit(1);
                }
 
                DateFormat dateFormat = new SimpleDateFormat("MMddHHmmsss");
                //get current date time with Date() to create a 11 digit tran id
                Date date = new Date();
                String tranId = dateFormat.format(date);
                String PRIMER_TRAN = "     V " + tranId + "9999999999000000000JANE       DOE         100 Redwood Shores Pkwy             Redwood City       CA94065000000000000000  PRIMER TRAN";
 
 
                try{
                        dataToSend = URLEncoder.encode("inputRecord", "UTF-8") + "=" + URLEncoder.encode(PRIMER_TRAN, "UTF-8");
 
                }catch(Exception e){
                        System.out.println("Exception caught!" + e.toString());
                }
                 // send message
                StringBuffer sb = new StringBuffer();
                sb.append("POST /" + appName + "/wrp HTTP/1.1\r\n");
                // Try connection close-- see if it does close
                sb.append("Connection: close\r\n");
                sb.append("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword\n");
                sb.append("Accept-Language: en-us\n");
                sb.append("Accept-Encoding: gzip, deflate\n");
                sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\n");
                // Authorization
                sb.append("Authorization: Basic DK34a3RvbWVydGVzddkK7WCx\n");
                sb.append("Host: " + ip + ":" + port + "\n");
                sb.append("Content-Length: " + dataToSend.length() + "\r\n");
                sb.append("Content-Type: application/x-www-form-urlencoded\r\n");
                sb.append("\r\n");
                sb.append(dataToSend);
                 // Send data
                String text = sb.toString();
                out.println(text);
 
                System.out.println("\nText sent " + text.length() + " bytes:");
                System.out.println(text + "\n\n");
 
                try{
                        String gotBack1 = in.readLine();
                        System.out.println("Text received:" + gotBack1 );
                        String gotBack = null;
                        while (  (gotBack = in.readLine()) != null){
                                System.out.println("Text received:" + gotBack );
                                if ( (gotBack.indexOf("TQ!") != -1)){
                                        break;
                                }
                        }
                } catch (Exception e){
                        System.out.println("Read failed! " + e.toString());
                        System.exit(1);
                }
        }
 
 
 
 
}

【问题讨论】:

    标签: java http tomcat utf-8


    【解决方案1】:

    修复它。显然 8.5.51 的 tomcat 不喜欢用 \n 终止标头。我将所有标题行终止符更改为 \r\n,现在我得到了 200 个成功代码。

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 2020-07-14
      • 2017-07-08
      • 2021-03-21
      • 1970-01-01
      • 2012-03-18
      • 2023-02-07
      • 2021-01-24
      • 2020-01-03
      相关资源
      最近更新 更多