Tomcat returns 意外响应代码 500 上的 WebSocket 握手

WebSocket Handshake on Tomcat returns Unexpected Response Code 500

我有一个 WebSocket 应用程序,它以编程方式注册端点,不使用注释。

相关代码为:

ServerEndpointConfig.Configurator configurator = 
                (ServerEndpointConfig.Configurator)configuratorClass.newInstance();   
ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder
                .create(endpointClass, endpointPath)
                .configurator(configurator)
                .build();

ServerContainer serverContainer = (ServerContainer)app
                .getServletContext()
                .getAttribute("javax.websocket.server.ServerContainer");
serverContainer.addEndpoint(serverEndpointConfig);

当我 运行 它在带有嵌入式 Jetty 容器的 IDE 中时一切正常,其中依赖于 tomcat-websocket 和 tomcat-websocket- api 库通过 Maven,但是当我在 Tomcat (8.5.5) 中部署它,然后尝试建立 WebSocket 连接时,我在浏览器的控制台中收到以下错误:

WebSocket connection to 'ws://127.0.0.1:8080/echo' failed: Error during WebSocket handshake: Unexpected response code: 500

我没有在 Catalina 输出中记录任何错误或其他信息,我不确定如何调试这个问题。

我需要以编程方式配置端点,因为很多信息在编译时是未知的,所以请不要给我指出注释解决方案。

我已将日志级别设置为精细,这是相关片段:

T.550 FINE [http-nio-IP-Acceptor-0] o.a.tomcat.util.threads.LimitLatch.countUpOrAwait Counting up[http-nio-IP-Acceptor-0] latch=2
T.551 FINE [http-nio-IP-exec-3] o.a.coyote.AbstractProtocol$ConnectionHandler.process Processing socket [o.a.tomcat.util.net.NioChannel@1e87b268:java.nio.channels.SocketChannel[connected local=/192.168.1.17:8080 remote=/192.168.1.17:51259]] with status [OPEN_READ]
T.551 FINE [http-nio-IP-exec-3] o.a.coyote.http11.Http11InputBuffer.parseRequestLine Received [GET /echo HTTP/1.1
Host: 192.168.1.17:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://192.168.1.17:8080
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: LUCEE_ADMIN_LANG=en; cfid=de1b0016-ad0c-4601-b8ce-ecb47771b9c8; cftoken=0; LUCEE_ADMIN_LASTPAGE=debugging.logs
Sec-WebSocket-Key: Ogg0VPp9O3XZlR8rrgz4Gg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

]
T.553 FINE [http-nio-IP-exec-3] o.a.tomcat.util.http.Rfc6265CookieProcessor.parseCookieHeader Cookies: Parsing b[]: LUCEE_ADMIN_LANG=en; cfid=de1b0016-ad0c-4601-b8ce-ecb47771b9c8; cftoken=0; LUCEE_ADMIN_LASTPAGE=debugging.logs
T.554 FINE [http-nio-IP-exec-3] o.a.catalina.authenticator.AuthenticatorBase.invoke Security checking request GET /echo
T.554 FINE [http-nio-IP-exec-3] o.a.catalina.realm.RealmBase.findSecurityConstraints   No applicable constraints defined
T.554 FINE [http-nio-IP-exec-3] o.a.catalina.authenticator.AuthenticatorBase.invoke  Not subject to any constraint
T.561 FINE [http-nio-IP-exec-3] o.a.tomcat.util.http.Parameters.setEncoding Set encoding to ISO-8859-1
T.563 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass loadClass(o.a.tomcat.util.collections.LocalStrings, false)
T.563 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass   Delegating to parent classloader1 java.net.URLClassLoader@31befd9f
T.563 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass   Searching local repositories
T.563 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.findClass     findClass(o.a.tomcat.util.collections.LocalStrings)
T.564 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.findClass     --> Returning ClassNotFoundException
T.564 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream getResourceAsStream(org/apache/tomcat/util/collections/LocalStrings.properties)
T.564 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   Delegating to parent classloader java.net.URLClassLoader@31befd9f
T.565 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   Searching local repositories
T.565 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   --> Resource not found, returning null
T.566 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass loadClass(o.a.tomcat.util.collections.LocalStrings_en, false)
T.566 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass   Delegating to parent classloader1 java.net.URLClassLoader@31befd9f
T.567 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass   Searching local repositories
T.567 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.findClass     findClass(o.a.tomcat.util.collections.LocalStrings_en)
T.568 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.findClass     --> Returning ClassNotFoundException
T.569 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream getResourceAsStream(org/apache/tomcat/util/collections/LocalStrings_en.properties)
T.569 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   Delegating to parent classloader java.net.URLClassLoader@31befd9f
T.570 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   Searching local repositories
T.571 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   --> Resource not found, returning null
T.571 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass loadClass(o.a.tomcat.util.collections.LocalStrings_en_US, false)
T.571 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass   Delegating to parent classloader1 java.net.URLClassLoader@31befd9f
T.572 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.loadClass   Searching local repositories
T.572 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.findClass     findClass(o.a.tomcat.util.collections.LocalStrings_en_US)
T.573 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.findClass     --> Returning ClassNotFoundException
T.573 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream getResourceAsStream(org/apache/tomcat/util/collections/LocalStrings_en_US.properties)
T.573 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   Delegating to parent classloader java.net.URLClassLoader@31befd9f
T.574 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   Searching local repositories
T.574 FINE [http-nio-IP-exec-3] o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream   --> Resource not found, returning null
T.581 FINE [http-nio-IP-exec-3] o.a.coyote.AbstractProcessorLight.process Socket: [o.a.tomcat.util.net.NioEndpoint$NioSocketWrapper@6689cfeb:o.a.tomcat.util.net.NioChannel@1e87b268:java.nio.channels.SocketChannel[connected local=/192.168.1.17:8080 remote=/192.168.1.17:51259]], Status in: [OPEN_READ], State out: [CLOSED]
T.582 FINE [http-nio-IP-exec-3] o.a.tomcat.util.threads.LimitLatch.countDown Counting down[http-nio-IP-exec-3] latch=2
T.114 FINE [http-nio-IP-exec-4] o.a.coyote.AbstractProtocol$ConnectionHandler.process Processing socket [o.a.tomcat.util.net.NioChannel@406eaa39:java.nio.channels.SocketChannel[connected local=/192.168.1.17:8080 remote=/192.168.1.17:51254]] with status [ERROR]
T.115 FINE [http-nio-IP-exec-4] o.a.tomcat.util.threads.LimitLatch.countDown Counting down[http-nio-IP-exec-4] latch=1

好的,经过多次调试后我发现 modifyHandshake() 抛出了一个 NPE 导致了这个问题。

我很惊讶,即使日志级别设置为 FINE,也没有记录任何相关内容。