websocket 解决 The extension [x-webkit-deflate-frame] is not supported 问题

在利用websocket进行实时性聊天过程中,由于浏览器问题,常常会出现不支持 websocket 相关扩展的问题,报错通常如下所示:

nested exception is java.lang.IllegalArgumentException: The extension [x-webkit-deflate-frame] is not supported


查了下发现这是浏览器版本较旧的问题,它们对于websocket的压缩仍然利用了很老的非规范扩展 “x-webkit-deflate-frame”,而新的firefox和chrome都不会发这个扩展头信息,而是发送websocket草案中规范的“permessage-deflate”。因此我们可以尝试在创建websocket连接前,将发送信息头部的Sec-WebSocket-Extensions值由“x-webkit-deflate-frame”修改为“permessage-deflate”,即强行修改websocket协议。


由于在 springmvc 中使用websocket时,我们已经在spring-mvc.xml文件中配置了websocket handler, 且在里面也配置了 interceptors, 如下所示:


因此我们可以在HandshakeInterceptor类里面的 beforeHandshake 函数中将此协议进行修改,添加 if 语句,最终如下所示:

package com.websocket.handshake;

import java.util.Map;  

import org.springframework.http.server.ServerHttpRequest;  
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;  
  
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{  
  
    @Override  
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, 
    		WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {  
    	
    	/** 在拦截器内强行修改websocket协议,将部分浏览器不支持的 x-webkit-deflate-frame 扩展修改成 permessage-deflate */
    	if(request.getHeaders().containsKey("Sec-WebSocket-Extensions")){
    		request.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate");
    	}
        System.out.println("Before Handshake");  
        return super.beforeHandshake(request, response, wsHandler, attributes);  
    }  
  
    @Override  
    public void afterHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Exception ex) {  
        System.out.println("After Handshake");  
        super.afterHandshake(request, response, wsHandler, ex);  
    }  
  
}  

测试结果如下,实现两个客户端的聊天问题:


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值