Tomcat 7.0.43 "INFO: Error parsing HTTP request header" 汤姆猫7.0.43“INFO:解析HTTP请求标头时出错”

55

我使用Tomcat 7.0.43版本来运行一个websocket应用程序。在Tomcat 7.0.42版本中,我的应用程序工作正常,但是在43版本中,当我尝试通过websockets访问我的服务器时,会出现以下输出:

Sep 16, 2013 3:08:34 AM org.apache.coyote.http11.AbstractHttp11Processor process
INFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

我的浏览器控制台显示如下内容:

WebSocket connection to 'ws://www.testapp.com/socket/notification/848df2e62fcf93e1b3?X-Atmosphere-tracking-i…Date=0&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true' failed: Unrecognized frame opcode: 5 

以下是该请求的访问日志:

"GET /socket/notification/848df2e62fcf93e1b3?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.0.2-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-Cache-Date=0&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true HTTP/1.1"

Tomcat 7.0.43有哪些变化?我需要做出哪些改变?


你能展示一下你正在发送的HTTP头吗? - Sotirios Delimanolis
@fatman 为什么Tomcat 7.0.43不支持我在Tomcat 7.0.42中使用的websocket?这没有任何意义啊。 - Michael
你得到了“failed: Unrecognized frame opcode: 5”的错误,显然问题就在那个区域。我不熟悉这个协议,但只是想给你一个指针(也许你设置了版本头?)。 - Tomer
@fatman,为什么这在版本42和43之间发生了变化? - Michael
@confile,你找到任何解决方案了吗?我也遇到了同样的问题。 - Nishant Shah
显示剩余3条评论
10个回答

37

如果您有这个监听器:

    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>

在您的 server.xml 文件中,将其删除并尝试一下。如果您正在使用 APR 连接器,则无法使用密钥库。


22

对我来说,问题在于传入了一个比通常预期更大的HTTP头。我通过在server.xml文件中的Connector节点上设置maxHttpHeaderSize="1048576"属性来解决它。


21
如果缓存了太多的cookie,会破坏服务器(请求头大小过大!)。清除cookie也可以解决这个问题。

我遇到了HttpClient的问题,我使用了method.addHeader而不是method.setHeader - wutzebaer
我只附加了一个标题,即内容类型,但仍然出现相同的错误。你能给些建议吗? - user641887
@user641887,那么你的问题可能不是由请求头大小引起的。 - Kimchi Man

20

检查一下,你是否错误地请求了HTTPS协议而不是HTTP。

我曾经忽视了我请求的是https://localhost:...而不是http://localhost:...,这导致了出现了奇怪的消息。


太好了。谢谢,这正是我的问题。 - David Kariuki

12

我遇到了类似的问题,我使用 Firefox 的 RESTClient 插件发送了一个带有请求体数据的 POST 请求,但是收到了相同的消息。

我的情况是由于我试图在未配置 HTTPS 的本地 tomcat 实例中使用 HTTPS 协议造成的。


是的,在我的情况下也是一样,有人试图输入了错误的 https://localhost:8080。 - Kalpesh Soni
即使在我的情况下也是如此,其中一位开发人员正在使用https从Postman进行访问。 - Murali

5
我的问题出现在尝试打开https时。我不使用SSL。
这是Tomcat bug
今天(2017年12月2日),最新的官方版本从Debian存储库中获取,是Tomcat 8.0.14
解决方案是从官方网站下载并安装最新版本的Tomcat 8、8.5、9或升级到来自jessie-backports的最新版本(8.5.x)。

Debian 8

添加到/etc/apt/sources.list

deb http://ftp.debian.org/debian jessie-backports main

然后从jessie-backports更新并安装Tomcat。

sudo apt-get update && sudo apt-get -t jessie-backports install tomcat8

Debian和Tomcat 8.0.14环境的bug报告:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=851304 - oguzhan00

3

我尝试了以上所有方法,但都没有成功。后来我改变了Tomcat的端口号,包括HTTP/1.1和管理端口,问题得以解决。

我看到其他的解决方法对别人有用,但如果以上方法都不行,可以尝试这个方法。

谢谢大家!


2
在我们的情况下,出现错误的原因是我们应用程序中有一个自定义的filter,它执行HttpServletResponse sendRedirect()到其他URL。
由于某种原因,重定向未关闭连接的keep-alive状态,因此出现了超时异常。
我们查阅了Tomcat文档,当我们将maxKeepAliveRequests禁用并将其值设置为1时,错误不再出现。
目前我们还没有实际解决方案来解决这个错误。

2

我在使用Debian 10和Tomcat作为应用服务器的Java项目中遇到了问题。

问题是当我在浏览器中使用http调用应用程序时,应用程序已经将https定义为默认协议。因此,当我尝试运行该应用程序时,我的日志文件中出现了以下错误:

org.apache.coyote.http11.AbstractHttp11Processor process
INFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

然而,我尝试在浏览器中使用 https 协议,但连接失败并抛出错误:

以下是我的解决方案:

你需要一个证书来设置应用程序的 https 协议。首先,我必须为应用程序创建一个 keystore 文件,这更像是 https 协议的自签名证书:

sudo keytool -genkey -keyalg RSA -alias tomcat -keystore /usr/share/tomcat.keystore

注意: 您需要在服务器上安装Java才能执行此操作。可以使用 sudo apt install default-jdk 命令来安装Java。

接下来,在Tomcat服务器配置文件(/opt/tomcat/conf/server.xml)中为应用程序添加了一个https Tomcat服务器连接器:

sudo nano /opt/tomcat/conf/server.xml

将以下内容添加到应用程序的配置中。请注意指定了密钥库文件的位置和密码。此外,定义了一个https协议的端口,该端口与http协议的端口不同:

<Connector protocol="org.apache.coyote.http11.Http11Protocol"
           port="8443" maxThreads="200" scheme="https"
           secure="true" SSLEnabled="true"
           keystoreFile="/usr/share/tomcat.keystore"
           keystorePass="my-password"
           clientAuth="false" sslProtocol="TLS"
           URIEncoding="UTF-8"
           compression="force"
           compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

因此,应用程序的完整服务器配置在 Tomcat 服务器配置文件 (/opt/tomcat/conf/server.xml) 中如下所示:

<Service name="my-application">
  <Connector protocol="org.apache.coyote.http11.Http11Protocol"
             port="8443" maxThreads="200" scheme="https"
             secure="true" SSLEnabled="true"
             keystoreFile="/usr/share/tomcat.keystore"
             keystorePass="my-password"
             clientAuth="false" sslProtocol="TLS"
             URIEncoding="UTF-8"
             compression="force"
             compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

  <Connector port="8009" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />

  <Engine name="my-application" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    </Realm>

    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
             prefix="localhost_access_log" suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    </Host>
  </Engine>
</Service>

这次我尝试通过浏览器访问应用程序,使用的是:

https://my-server-ip-address:https-port

在我的情况下,它是这样的:

https:35.123.45.6:8443

它运行得很好。但是,我必须接受一个警告,为该网站添加了一个安全例外,因为所使用的证书是自签名的。

就这些了。

希望这有所帮助。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接