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。
单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。
半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。
全双工:同时可进行双向数据传输。
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: