WebSocket之Sec-WebSocket-Protocol (带token发起连接)
问题: ws连接是无法像http一样完全自主定义请求头的,给token认证带来了不便
先看WebScoket构造函数官方文档
var aWebSocket = new WebSocket(url [, protocols]);
url
要连接的URL;这应该是WebSocket服务器将响应的URL。
protocols 可选
一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定子协议,这样单个服务器可以实现多个WebSocket子协议(例如,您可能希望一台服务器能够根据指定的协议(protocol)处理不同类型的交互)。如果不指定协议字符串,则假定为空字符串。
protocols对应的就是发起ws连接时, 携带在请求头中的Sec-WebSocket-Protocol属性, 服务端可以获取到此属性的值用于通信逻辑(即通信子协议,当然用来进行token认证也是完全没问题的)
代码示例
//前端
var aWebSocket = new WebSocket(url ['用户token']);
//后端
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//这里就是我们所提交的token
String submitedToken=session.getHandshakeHeaders().get("sec-websocket-protocol").get(0);
//根据token取得登录用户信息(业务逻辑根据你自己的来处理)
}
另外,如果需要在第一次握手前的时候就取得token,只需要在header里面取得就可以啦
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
System.out.println("准备握手");
String submitedToken = serverHttpRequest.getHeaders().get("sec-websocket-protocol")
return true;
}