2017-02-14 3578 views
27

當我在多服務器Apache Tomcat 8環境中部署我的應用程序時,我正在獲取下面的堆棧跟蹤。我經常得到這個錯誤,似乎它阻止tomcat的線程:java.lang.IllegalArgumentException:在方法名稱中找到無效的字符。 HTTP方法名稱必須是標記

INFO [http-nio-80-exec-4461] org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header 
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. 
 java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens 
 at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:233) 
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017) 
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) 
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524) 
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480) 
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
 at java.lang.Thread.run(Unknown Source) 

任何一個可以指導我如何解決或縮小這種exeption?我沒有得到任何我的應用程序源文件的任何參考。我試圖谷歌周圍,並在它說的鏈接,你試圖通過https訪問http url,這似乎不太可能。當應用程序在單個Tomcat 8實例上運行時,我沒有收到此錯誤。我只能在多服務器環境中獲得此信息。

我也在每個頁面上分享我嵌入的元標記,如果這有助於識別原因。

<% 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setHeader("Cache-Control", "no-store"); 
    response.setDateHeader("Expires", 0); 
    response.setHeader("Pragma", "no-cache"); 
%> 


<head> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 

我也用了幾頁,這基本上是與上面相同如下:

<meta charset="utf-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 
<meta http-equiv="Expires" content="-1" /> 
<meta http-equiv="Cache-Control" content="private" /> 
<meta http-equiv="Cache-Control" content="no-store" /> 
<meta http-equiv="Pragma" content="no-cache" /> 

即使有人幫助讓我的故障排除嘗試的方向,這將是有用的,因爲目前我不知道該在哪裏尋找。

在此先感謝。

回答

53

當您嘗試從未啓用https的端點上的客戶端執行https請求時,可能會發生此異常。客戶端將在服務器期待原始數據時加密請求數據。

+1

我不知道我明白這個答案。我有一個Spring Boot 1.5.1應用程序,我在我的日誌中看到這個異常。我的應用程序只對端口8443上的SSL(從端口443重定向)回答SSL,並且只有一個SSL連接器。你是說有人可以嘗試http:而不是https:在端口443上? –

+2

當服務器期望與獲得的內容不匹配時會發生這種異常。你說的是可能的情況之一。也許你的服務器中有一個端點不能在https上運行,但有人試圖以這種方式訪問​​它? –

+1

嗨,彼得......問題最終因爲有人創建了一個IP表規則將端口80轉發到端口8443,所以任何使用端口80上的http命中該網站的人都會導致該錯誤。我們添加了一個Tomcat連接器將端口8080重定向到8443,並設置了IP Tables規則將端口80轉發到端口8080,問題幾乎沒有了。感謝您的回覆! –