开发者社区> 问答> 正文

[x-webkit-deflate-frame] is not supported:报错

使用spring4+tomcat8,运行后,报错,提示 The extension [x-webkit-deflate-frame] is not supported:报错

刚接触这个,使用spring4+tomcat8,运行后,报错,提示  

2015-08-18 21:40:30,194[org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver]-[DEBUG] Resolving exception from handler [org.springframework.web.socket.server.support.WebSocketHttpRequestHandler@59a6cc]: org.springframework.web.socket.server.HandshakeFailureException: Uncaught failure for request http://localhost:8080/spring4/myHandler; nested exception is java.lang.IllegalArgumentException: The extension [x-webkit-deflate-frame] is not supported

2015-08-18 21:40:30,195 [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver]-[DEBUG] Resolving exception from handler [org.springframework.web.socket.server.support.WebSocketHttpRequestHandler@59a6cc]: org.springframework.web.socket.server.HandshakeFailureException: Uncaught failure for request http://localhost:8080/spring4/myHandler; nested exception is java.lang.IllegalArgumentException: The extension [x-webkit-deflate-frame] is not supported
2015-08-18 21:40:30,196 [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] Could not complete request
org.springframework.web.socket.server.HandshakeFailureException: Uncaught failure for request http://localhost:8080/spring4/myHandler; nested exception is java.lang.IllegalArgumentException: The extension [x-webkit-deflate-frame] is not supported
at org.springframework.web.socket.server.support.WebSocketHttpRequestHandler.handleRequest(WebSocketHttpRequestHandler.java:128)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

展开
收起
kun坤 2020-06-14 13:37:26 1052 0
1 条回答
写回答
取消 提交回答
  • 这个说明浏览器比较旧(估计是safari,至少safari6就是这样,safari8不知道有无此问题),对于websocket压缩还是用的很老的非规范的扩展“x-webkit-deflate-frame”,新的firefox,chrome都不会发这个扩展头信息,而是发送草案中规范的“permessage-deflate” 。但是另外spring4对于这个非规范的老扩展兼容也不太好(其实就是bug),按理应该忽略这个扩展,让tomcat和浏览器进行非压缩的websocket通讯即可。 spring4看起来比较矫情,它采取了抛异常,这是不合理的。而tomcat8自带的examples中websocket的例子对于“x-webkit-deflate-frame”不会出问题,因为tomcat8对于x-webkit-deflate-frame是采取忽略的态度,不回发压缩扩展协商成功的头,即表明采用非压缩方式传输,这样就没有问题了。######

    web.socket

    看起来你的浏览器不支持,导致spring的这个扩展也报错了

    ######我试过多个浏览器都还是一样######

    org.springframework.web.socket.server.HandshakeFailureException: Uncaught failure for request http://localhost:8080/spring4/myHandler; nested exception is java.lang.IllegalArgumentException: The extension [x-webkit-deflate-frame] is not supported


     注意这个 估计是websocket的问题 spring4/myHandler这个是你自己写的吧 问题在这

    ######

    引用来自“苏大泉”的评论

    org.springframework.web.socket.server.HandshakeFailureException: Uncaught failure for request http://localhost:8080/spring4/myHandler; nested exception is java.lang.IllegalArgumentException: The extension [x-webkit-deflate-frame] is not supported


     注意这个 估计是websocket的问题 spring4/myHandler这个是你自己写的吧 问题在这

    spring4是我的项目名称

    <websocket:handlers>
            <websocket:mapping path="/myHandler" handler="myHandler2"/>
            <websocket:handshake-interceptors>
            <bean  class="com.lzc.websocket.MySocketHandlerInterfaceIml"/>
            <!-- 
                <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
                 -->
            </websocket:handshake-interceptors>
            <!-- <websocket:sockjs client-library-url="/sockjs/sockjs-client.js" /> -->
        </websocket:handlers>


        <bean id="myHandler2" class="com.lzc.websocket.MyHandler"/>

    ######

    引用来自“xfeep”的评论

    这个说明浏览器比较旧(估计是safari,至少safari6就是这样,safari8不知道有无此问题),对于websocket压缩还是用的很老的非规范的扩展“x-webkit-deflate-frame”,新的firefox,chrome都不会发这个扩展头信息,而是发送草案中规范的“permessage-deflate” 。但是另外spring4对于这个非规范的老扩展兼容也不太好(其实就是bug),按理应该忽略这个扩展,让tomcat和浏览器进行非压缩的websocket通讯即可。 spring4看起来比较矫情,它采取了抛异常,这是不合理的。而tomcat8自带的examples中websocket的例子对于“x-webkit-deflate-frame”不会出问题,因为tomcat8对于x-webkit-deflate-frame是采取忽略的态度,不回发压缩扩展协商成功的头,即表明采用非压缩方式传输,这样就没有问题了。
    确实是这样的,我前两天反编译了几个class查看了下,确实是因为目前tomcat所支持的是 permessage-deflate,而spring4是直接将异常给抛出来了######关键是应该怎么解决这个问题呢?spring4 + tomcat8 ,safari8也是同样的问题。
    ######直接用tomcat 8(比如8.0.24)的websocekt肯定可以和safari通讯的,而且也不复杂;如果一定要用spring,那么在upgradeStrategy上面做些事情应该是可以的,比如用TomcatRequestUpgradeStrategy试试。因为本人不用这些,所以没有时间去尝试,但原理是确是可行的。######可以使用自定义Interceptor解决这个问题。比如这样:
     registry.addHandler(systemWebSocketHandler(),"/webSocketServer").addInterceptors(new HandshakeInterceptor() {
                
                @Override
                public boolean beforeHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1, WebSocketHandler arg2, Map<String, Object> arg3) throws Exception {
                    //
                    if(arg0.getHeaders().containsKey("Sec-WebSocket-Extensions")) {
                         arg0.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate");
                    }
                    return true;
                }
                
                @Override
                public void afterHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1, WebSocketHandler arg2, Exception arg3) {
                    // TODO Auto-generated method stub
                    
                }
            });
    ######

    引用来自“钱学超”的评论

    可以使用自定义Interceptor解决这个问题。比如这样:
     registry.addHandler(systemWebSocketHandler(),"/webSocketServer").addInterceptors(new HandshakeInterceptor() {
                
                @Override
                public boolean beforeHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1, WebSocketHandler arg2, Map<String, Object> arg3) throws Exception {
                    //
                    if(arg0.getHeaders().containsKey("Sec-WebSocket-Extensions")) {
                         arg0.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate");
                    }
                    return true;
                }
                
                @Override
                public void afterHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1, WebSocketHandler arg2, Exception arg3) {
                    // TODO Auto-generated method stub
                    
                }
            });
    这个办法却是可以,试了下,这个是在拦截器里面强行修改了websocket的协议了。还有个问题想问下,就是Spring4对于不支持的websocket的浏览器,是采用了socketJS来实现的,在代码里面,默认的js位置是https://d1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.4.min.js,在官方的文档中,说配置client-library-url这个属性就可以修改为指定的位置,但是我配置了之后还是不能修改这个位置,这个原因是什么
    2020-06-14 13:37:32
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Image Compression using K-mean 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载