試了好多種方法,貌似還是沒有解決問題,不過也學到了點東西,記錄下備忘吧。
異常詳情:
1、首先看到最多的就是說在server.xml中的Connector中添加maxHttpHeaderSize="8192",像下面這樣設置的。
<Connector port="8080" protocol="HTTP/1.1" maxHttpHeaderSize="8192" connectionTimeout="20000" maxThreads="150" maxSpareThreads="75" redirectPort="8443" />
但是我查了tomcat的配置介紹https://tomcat.apache.org/tomcat-8.5-doc/config/http.html ,這個屬性默認的就是8192(8KB),我索性給設置成maxHttpHeaderSize="81920"了,不過貌似還是沒有解決問題,依然出現同樣的異常
不過這兩個設置: maxSpareThreads="75"在我啟動tomcat的時候會有如下警告,而且我在tomcat的配置文檔中並沒有找到此屬性,所以我感覺還是不要設置的好
10-Sep-2019 11:38:15.659 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareThreads' to '75' did not find a matching property.
關於這個maxHttpHeaderSize的設置,還有個比較厲害的大神,修改源碼了,能看懂的可以試試,反正我這個小菜鳥表示有心無力
2、還有種說法說的是設計到不合法字符的原因,Error parsing HTTP request header翻譯過來就是請求頭錯誤嘛
以下內容參考:https://www.jianshu.com/p/83735dc80603?spm=a2c6h.13066369.0.0.44c05da9lfSEG7
首先:不推薦降低tomcat版本,這等於掩耳盜鈴,絕對得不償失。
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,在http解析時做了嚴格限制。
RFC3986文檔規定,請求的Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。
解決方案:在在conf/catalina.properties中最后添加2行:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
不幸的是, requestTargetAllow
只能配置|、{、} 允許這三個字符,對於其他的(例如" < > [ \ ] ^ ` { | } .),在請求時,仍然攔截,如果使用了|{}之外的其他字符那怎么辦呢?那就還需要如下配置。
relaxedPathChars="[\]^`{|}" relaxedQueryChars="[\]^`{|}"
不過我在添加這個備注之后,啟動里會有如下警告,暫時不知道是何原因,而且我的網址中並沒有這些特殊符號,索性就刪除了,如果有這些特殊符號的,可以嘗試下。
10-Sep-2019 11:38:15.663 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'relaxedPathChars' to '[\]^`{|}' did not find a matching property.
10-Sep-2019 11:38:15.663 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'relaxedQueryChars' to '[\]^`{|}' did not find a matching property.
3、有個神奇的解決方法,說是https的問題,改成http就好了,我本來就用的是http,所以沒有嘗試此方法,如果有這種情況的話,可以嘗試
4、修改連接協議
4.1將HTTP1.1改成org.apache.coyote.http11.Http11NioProtocol,結果啟動tomcat的時候出現了一大堆“地址已使用”的錯誤,不求甚解,頭大中
這里學習一點Linux查看端口的知識:Linux 查看端口占用情況可以使用 lsof 和 netstat 命令。
(1)lsof的用法:
lsof -i:端口號
(2)netstat用法:
netstat -tunlp | grep 端口號
netstat命令各個參數說明如下:
-a:列出所有網絡狀態,包括 Socket 程序;
-c秒數:指定每隔幾秒刷新一次網絡狀態;
-n:使用 IP 地址和端口號顯示,不使用域名與服務名;
-p:顯示 PID 和程序名;
-t:顯示使用 TCP 協議端口的連接狀況;
-u:顯示使用 UDP 協議端口的連接狀況;
-I:僅顯示監聽狀態的連接;
-r:顯示路由表;
即可顯示當前服務器上所有端口及進程服務,於grep結合可查看某個具體端口及服務情況··
(3)殺死進程
kill -9 PID
4.2 將HTTP1.1改成protocol="org.apache.coyote.http11.Http11Protocol",啟動時提示此寫法已過時,讓采用上一種協議
10-Sep-2019 14:55:12.963 警告 [main] org.apache.coyote.http11.Http11Protocol.<init> The HTTP BIO connector has been removed in Tomcat 8.5.x onwards. The HTTP BIO connector configuration has been automatically switched to use the HTTP NIO connector instead.
5、在你的tomcat的server.xml上,刪除一個監聽
把標紅的注釋掉,重啟項目(未實驗)
6、降低tomcat版本,原因是Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了對於http頭的驗證。
2019年9月16日補充: 更換版本之后已將近一周沒出此異常。
2019年9月24日補充:一切正常,此方法可行
7、2020年5月補充,今天查資料的時候遇到有人遇到同樣的問題,更新一下(未曾嘗試,備用)。
參考網址:https://www.cnblogs.com/yanh0606/p/12737789.html
解決辦法:修改conf/catalina.properties文件,最后一行增加tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
再重啟tomcat,就沒有再報錯了
問題:還遇到個用 /var/lib/tomcat-7.0-bsp/bin/catalina.sh start; 命令啟動的時候報錯,Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
解決辦法:在catalina.sh文件的開頭添加JAVA_HOME的環境變量后不報錯了
export JAVA_HOME=/var/lib/jdk1.8.0_221