【发布时间】: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);
}
}
}
【问题讨论】: