试了好多种方法,貌似还是没有解决问题,不过也学到了点东西,记录下备忘吧。
异常详情:
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.