使用Sec WebSocket密钥来标识WebSocket客户端连接是一个好主意吗?

使用Sec WebSocket密钥来标识WebSocket客户端连接是一个好主意吗?,websocket,netty,Websocket,Netty,在servlet世界中,会有cookies和HttpSession之类的东西让我识别谁在使用我的restful服务来将请求路由到正确的数据。将Sec WebSocket密钥当作标识客户端连接的cookie来使用是一个好主意吗 具体来说,我使用socko scala库(一个基于netty的akka Web服务器)来实现一个websocket服务器,该服务器从位于的演示应用程序开始。Socko正在包装一个netty频道,并将netty WebSocketFrame传递到应用程序代码中。然后,我希望根

在servlet世界中,会有cookies和HttpSession之类的东西让我识别谁在使用我的restful服务来将请求路由到正确的数据。将Sec WebSocket密钥当作标识客户端连接的cookie来使用是一个好主意吗

具体来说,我使用socko scala库(一个基于netty的akka Web服务器)来实现一个websocket服务器,该服务器从位于的演示应用程序开始。Socko正在包装一个netty频道,并将netty WebSocketFrame传递到应用程序代码中。然后,我希望根据我之前与最终用户数据(例如他们的购物篮)关联的客户端连接的“某些标识”来发送传入数据帧。为此,我编写了扩展方法来公开Sec WebSocket Key http头,就好像它是通过从原始WebSocket握手中挖掘http头而进入应用程序的对象的顶级属性一样:

package org.mashupbots.socko.examples.websocket
//pimp my library模式以添加扩展方法
对象ChatWebSocketExtensions{
导入org.mashupbots.socko.events.WebSocketFrameEvent
使用WebSocketKey为WebSocketFrameEvents类(wsFrame:WebSocketFrameEvent){
def secWebSocketKey:String={
wsFrame.initialHttpRequest.headers.get(“Sec WebSocket密钥”).getOrElse(“null”)
}
}
隐式def WebSocketFrameEventWissecWebSocketKey(wsFrame:WebSocketFrameEvent)=新建WebSocketFrameEventWissecWebSocketKey(wsFrame)
导入org.mashupbots.socko.events.WebSocketHandshakeEvent;
类WebSocketHandshakeEventWithSecWebSocketKey(事件:WebSocketHandshakeEvent){
def secWebSocketKey:字符串={
val option=option(event.nettyhtprequest.getHeader(“Sec WebSocket密钥”))
返回选项。getOrElse(“空”);
}
}
隐式def webSocketHandshakeEventWithSecWebSocketKey(事件:WebSocketHandshakeEvent)=新webSocketHandshakeEventWithSecWebSocketKey(事件)
}
这只是一些语法上的甜点,这样应用程序代码就不必在低级对象中四处挖掘,就可以获得Sec WebSocket密钥头并像访问一级属性一样访问它:

val路由=路由({
案例WebSocketHandshake(wsHandshake)=>wsHandshake匹配{
案例获取(PathSegments(“websocket”::roomNumber::Nil))=>{
日志信息(“握手加入房间”+房间号)
wsHandshake.authorize(onComplete=Some((事件:WebSocketHandshakeEvent)=>{
val identity=event.secWebSocketKey;
日志信息(“授权连接:+标识”);
//使用此已识别的用户连接执行某些操作
}))
}
}
案例WebSocketFrame(wsFrame)=>{
//握手完成后,我们现在可以处理从客户端发送的帧
val identity=wsFrame.secWebSocketKey;
log.info(“聊天来源:“+身份”);
//使用此已识别的数据帧执行某些操作
}
})

我的问题是,这是一种良好的做法还是有更好的方法来识别用户连接?

'Sec-WebSocket-Key'识别连接

然而,我不太确定使用“Sec WebSocket密钥”是否是识别“会话”的好方法

这是因为“Sec WebSocket密钥”不适用于断开连接并且需要客户端建立新连接的情况。可能会发布新的“Sec WebSocket密钥”。用户将失去他/她的会话

对于HTTP,会话通常与URL中的cookie或id关联,两者都独立于HTTP连接。这样,多个HTTP连接可用于单个用户会话

我建议您在web套接字“会话”中使用类似的东西

作为握手和成功登录的一部分,让服务器向客户端发送会话id。客户端应在每次请求时将会话id发送回服务器

通过这种方式,您可以像javascript一样在应用程序代码中提供网络弹性


希望这有帮助。

我读的是措辞,而不是代码。我正在寻找类似的解决方案。我想知道,会话管理是通过HTTP头在Tomcat等中完成的,对吗?也许这是可以利用的?因为socko还没有论坛,我在他们的问题追踪器上指出了这个问题