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的情况。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201026183605331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjU4NjEyMA==,size_16,color_FFFFFF,t_70#pic_center)
在使用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。
单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。
半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。
全双工:同时可进行双向数据传输。
websocket与http图解
websocket与HTTP
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 相关的代码有误,可以检查一下代码实现是否正确。
如果您能提供更具体的错误信息以及相关的代码和配置信息,我们可以更好地帮您解决问题。
ZooKeeper集群Leader选举理论解读(初次选举和故障恢复)
dalei23:
WebSocket通信原理和在Tomcat中实现源码详解(万字爆肝)
imonkeyi: