44

我将 Tomcat 7.0.43 与 websocket 应用程序一起使用。我的应用程序在 Tomcat 7.0.42 中运行良好,但是当我尝试在 websockets 上访问我的服务器时,我得到以下输出 43:

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 发生了什么变化?我必须改变什么?

4

10 回答 10

30

如果你有这个监听器:

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

在您的 server.xml 上,将其删除并尝试。如果您使用 APR 连接器,则不能使用密钥库

于 2013-11-22T12:14:38.077 回答
19

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

于 2015-05-14T19:03:37.753 回答
19

对我来说,问题在于传递的 HTTP 标头比通常预期的要大。我通过在 server.xml 的连接器节点上设置 maxHttpHeaderSize="1048576" 属性来解决它。

于 2015-10-16T21:12:39.377 回答
12

我有一个类似的问题,我正在发送一个 POST 请求(使用 Firefox 的 RESTClient 插件),请求正文中包含数据,并且收到了相同的消息。

就我而言,这是因为我试图在未配置 HTTPS 的本地 tomcat 实例中使用 HTTPS 协议。

于 2015-06-18T09:01:06.957 回答
8

检查,如果您不是意外地请求 HTTPS 协议而不是 HTTP。

我忽略了我是在请求https://localhost:...而不是http://localhost:...它导致了这个奇怪的消息..

于 2019-11-04T15:50:43.367 回答
5

当我尝试打开https时出现我的问题。我不使用 SSL。

这是Tomcat错误

今天12/02/2017来自 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
于 2017-02-12T17:42:44.480 回答
3

我尝试了以上所有方法,对我没有任何帮助。然后我更改了 HTTP/1.1 和 Tomcat 管理端口的 tomcat 端口号,它得到了解决。

我看到上面的其他解决方案对人们有用,但如果上述任何一个都不起作用,那么值得尝试这个解决方案。

感谢大家!

于 2016-02-12T10:23:30.147 回答
2

在我们的例子中,错误的发生是因为我们filter的应用程序中有一个自定义,它对HttpServletResponse sendRedirect()其他 url 有作用。

由于某种原因,重定向没有关闭keep-alive连接的状态,因此出现超时异常。

我们检查了Tomcat Docs,当我们maxKeepAliveRequests通过将其值设置为禁用时1,错误停止显示。

目前我们还没有解决该错误的实际方法。

于 2016-07-29T08:57:08.800 回答
1

如果您不想升级您的 tomcat,请在您的catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

它对我 有用 http://www.zhoulujun.cn/zhoulujun/html/java/tomcat/2018_0508_8109.html

于 2018-05-08T02:32:49.373 回答
0

在使用Tomcat作为应用程序服务器的Debian 10中处理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协议。我首先必须为应用程序创建一个密钥库文件,更像是https协议的自签名证书:

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

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

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

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

它工作得很好。虽然,我不得不接受一个警告,它为网站添加了一个安全例外,因为使用的证书是自签名的。

就这样。

我希望这有帮助

于 2020-10-06T10:46:18.937 回答