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, 如下所示:

websocket 解决 The extension [x-webkit-deflate-frame] is not supported 问题_第1张图片

因此我们可以在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 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);  
    }  
  
}  

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

websocket 解决 The extension [x-webkit-deflate-frame] is not supported 问题_第2张图片

你可能感兴趣的:(JAVA学习,Web)