添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

tomcat websocket类型转换异常:org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.

最新推荐文章于 2024-01-10 21:53:19 发布
最新推荐文章于 2024-01-10 21:53:19 发布 阅读量1.3k

java.lang.ClassCastException: org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound
at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:842)
at org.apache.coyote.Request.action(Request.java:344)
at org.apache.catalina.connector.Request.doUpgrade(Request.java:2813)
at org.apache.catalina.connector.RequestFacade.doUpgrade(RequestFacade.java:1103)
at org.apache.catalina.websocket.WebSocketServlet.doGet(WebSocketServlet.java:131)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.NioEndpoint A b s t r a c t C o n n e c t i o n H a n d l e r . p r o c e s s ( A b s t r a c t P r o t o c o l . j a v a : 5 8 5 ) a t o r g . a p a c h e . t o m c a t . u t i l . n e t . N i o E n d p o i n t SocketProcessor.run(NioEndpoint.java:1653)
at java.util.concurrent.ThreadPoolExecutor W o r k e r . r u n T a s k ( T h r e a d P o o l E x e c u t o r . j a v a : 8 8 6 ) a t j a v a . u t i l . c o n c u r r e n t . T h r e a d P o o l E x e c u t o r Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

org.apache.coyote.Request 无法转换为 org.apache.coyote.http11.upgrade.UpgradeInbound

这个异常时有时无,出现的时候也不会影响系统的正常运行。

首先从异常堆栈定位出现异常的源码位置。

at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:842)
at org.apache.coyote.Request.action(Request.java:344)
at org.apache.catalina.connector.Request.doUpgrade(Request.java:2813)
at org.apache.catalina.connector.RequestFacade.doUpgrade(RequestFacade.java:1103)
at org.apache.catalina.websocket.WebSocketServlet.doGet(WebSocketServlet.java:131)

1. org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:842) ,找到源码 AbstractHttp11Processor.action 842行, this.upgradeInbound = ((UpgradeInbound)param); param 转为 UpgradeInbound 出现类型不匹配。 在这里插入图片描述

2. 这时看看哪里调用了 AbstractHttp11Processor.action 。继续看异常堆栈org.apache.coyote.Request.action(Request.java:344) ,找到 org.apache.coyote.Request 类第344行:
在这里插入图片描述

343行代码会判断 param 是否为null, param=null ,调用 this.hook.action(actionCode, this); 第二个参数直接传了一个 this ,这个 this 就是 org.apache.coyote.Request 。从这里就已经看出因为参数 param=null ,直接把 org.apache.coyote.Request 本身当作 param 传给了 hook.action() ,这个 hook 就是 org.apache.coyote.http11.AbstractHttp11Processor 。( AbstractHttp11Processor 继承了 AbstractProcessor AbstractProcessor 实现了接口 ActionHook

3.继续深究,什么情况下 org.apache.coyote.Request.action(ActionCode actionCode, Object param) 的第二个参数 param 等于null呢?

找到 org.apache.catalina.connector.Request.doUpgrade(Request.java:2813) 代码位置,可以看到该方法第二个参数 UpgradeInbound inbound ,也就验证了 org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound
在这里插入图片描述

4. at org.apache.catalina.connector.RequestFacade.doUpgrade(RequestFacade.java:1103)
在这里插入图片描述

5. at org.apache.catalina.websocket.WebSocketServlet.doGet(WebSocketServlet.java:131) ,从源码可以看到 StreamInbound inbound = createWebSocketInbound(subProtocol, wrapper); ,源头找到了,就是因为 createWebSocketInbound 这个方法创建的 inbound 可能等于null,然后就出现了后面类型转换的问题。
在这里插入图片描述
在这里插入图片描述

protected abstract StreamInbound createWebSocketInbound(String paramString, HttpServletRequest paramHttpServletRequest);
public abstract class StreamInbound
  implements UpgradeInbound{...}

createWebSocketInbound是一个静态方法,使用tomcat的webSocket的功能,需要继承org.apache.catalina.websocket.WebSocketServlet,实现createWebSocketInbound,这个跟wesocket三次握手建立连接有关。查看项目代码,自行实现的createWebSocketInbound确实存在返回null的情况。
在这里插入图片描述

在使用tomcat的websocket 功能时,自行实现org.apache.catalina.websocket.WebSocketServlet#createWebSocketInbound有存在返回null的情况,导致后面org.apache.coyote.Request.action(Request.java:344)判断org.apache.coyote.http11.upgrade.UpgradeInbound类型的参数为空时,将自己(this)代替传了进去,从而出现了org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound的异常。

在使用tomcat的websocket 功能时,继承org.apache.catalina.websocket.WebSocketServlet,自行实现org.apache.catalina.websocket.WebSocketServlet#createWebSocketInbound时不能返回null。

PS: 如若文章中有错误理解,欢迎批评指正,同时非常期待你的评论、点赞和收藏。我是徐同学,愿与你共同进步!

tomcat websocket类型转换异常:org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade. 在使用tomcat的websocket 功能时,继承`org.apache.catalina.websocket.WebSocketServlet`,自行实现`org.apache.catalina.websocket.WebSocketServlet#createWebSocketInbound`时不能返回null。 单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。 半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。 全双工:同时可进行双向数据传输。 websockethttp图解 websocketHTTP 1、都是一样基于TCP协议,都是可靠性传输协议 2、都是应用层协议 1、websocket是双向通信协议,模拟socket协议,可以双向发送或接受信息。HTTP是单向的。 2、都是需要握手进行建立连接的,但H 信息: 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。 java.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号. atorg.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.jav.
java.lang.ClassCastException: org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Proc
Tomcat报错:org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误
这个错误我仔细的观察了下,是浏览器的坑,先看下报错 [http-nio-8080-exec-6] org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。 java.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号. at org.apache.coyote.http11.Http1
1. 模块架构 org.apache.coyote.http11包支持http1.1协议,内部分为三类:ARP、NIO、普通http,这里只对最基本的普通http(使用java的IO流,而非NIO流)作简单研究。 这个包主要有以下几个类: Http11Protocol,实现了ProtocolHandler接口 Http11Processor,实现了ActionHook接口 Inter...
下面是使用 org.apache.http.client.methods 发送 POST 请求并返回字符串的示例代码: import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.S...
这个错误通常是由于 WebSocket 连接过程中出现了错误导致的。可能的原因包括: 1. 网络连接问题:可能是网络连接不稳定,或者网络带宽不足导致的,可以检查一下网络连接是否正常。 2. 服务器配置问题:可能是服务器的配置不正确导致的,比如 WebSocket 的配置不正确,可以检查一下服务器的配置文件。 3. 代码实现问题:可能是代码实现有误导致的,比如 WebSocket 相关的代码有误,可以检查一下代码实现是否正确。 如果您能提供更具体的错误信息以及相关的代码和配置信息,我们可以更好地帮您解决问题。
“为什么要去了解WebSocket的发展历史和背景呢?”,这个问题问的好。 其实,我也总是去尝试梳理技术发展历史脉络。 因为,在你梳理清楚了技术的发展线路。你在开发中遇到的问题,就可以按图索骥去寻找答案。可以帮助你去定位问题到底是出现在技术链条的哪一个环节。 总的来说,我认为,技术历史脉络,本身就包含着技术相关的开发思路和解决途径。 ZooKeeper集群Leader选举理论解读(初次选举和故障恢复) dalei23: 相同的问题 2台节点应该也可以选举才对 WebSocket通信原理和在Tomcat中实现源码详解(万字爆肝) imonkeyi: 大佬有例子吗?我用原生Java实现中的继承抽象类,然后用在线工具连接失败