gpt4 book ai didi

websocket - 使用 Sec-WebSocket-Key 来识别 websocket 客户端连接是个好主意吗?

转载 作者:行者123 更新时间:2023-12-03 08:26:13 32 4
gpt4 key购买 nike

在 servlet 世界中,我会使用 cookie 和 HttpSession 之类的东西来识别谁在访问我的 Restful 服务以将请求路由到正确的数据。将 Sec-WebSocket-Key 用作识别客户端连接的 cookie 是否是个好主意?

具体来说,我使用 socko scala 库(一个基于 netty 的 akka 网络服务器)来实现一个 websocket 服务器,该服务器从 socko-examples 的演示应用程序开始。 . Socko 正在包装一个 netty Channel 并将一个 netty WebSocketFrame 传递到应用程序代码中。然后,我想根据我之前与最终用户数据(例如他们的购物篮)相关联的客户端连接的“某些身份”调度传入数据的框架。为此,我编写了扩展方法来公开 Sec-WebSocket-Key http header ,就好像它是通过从原始 websocket 握手中挖掘出 http header 而进入应用程序的对象的顶级属性:

package org.mashupbots.socko.examples.websocket

// pimp my library pattern to add extension method
object ChatWebSocketExtensions {
import org.mashupbots.socko.events.WebSocketFrameEvent

class WebSocketFrameEventWithSecWebSocketKey(wsFrame: WebSocketFrameEvent) {
def secWebSocketKey: String = {
wsFrame.initialHttpRequest.headers.get("Sec-WebSocket-Key").getOrElse("null")
}
}
implicit def webSocketFrameEventWithSecWebSocketKey(wsFrame: WebSocketFrameEvent) = new WebSocketFrameEventWithSecWebSocketKey(wsFrame)

import org.mashupbots.socko.events.WebSocketHandshakeEvent;

class WebSocketHandshakeEventWithSecWebSocketKey(event: WebSocketHandshakeEvent) {
def secWebSocketKey: String = {
val option = Option(event.nettyHttpRequest.getHeader("Sec-WebSocket-Key"))
return option.getOrElse("null");

}
}
implicit def webSocketHandshakeEventWithSecWebSocketKey(event: WebSocketHandshakeEvent) = new WebSocketHandshakeEventWithSecWebSocketKey(event)

}

这只是一些语法糖,因此应用程序代码不必在低级对象中挖掘以获取 Sec-WebSocket-Key header ,只需像访问第一类属性一样访问它:

  val routes = Routes({
case WebSocketHandshake(wsHandshake) => wsHandshake match {
case GET(PathSegments("websocket" :: roomNumber :: Nil)) => {
log.info("Handsake to join room " + roomNumber)
wsHandshake.authorize(onComplete = Some((event: WebSocketHandshakeEvent) => {
val identity = event.secWebSocketKey;
log.info("Authorised connection:" + identity);
// do something with this identified user connection
}))
}
}

case WebSocketFrame(wsFrame) => {
// Once handshaking has taken place, we can now process frames sent from the client
val identity = wsFrame.secWebSocketKey;
log.info("chat from:" + identity);
// do something with this identified data frame
}

})

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

最佳答案

“Sec-WebSocket-Key”标识连接。

但是,我不太确定使用“Sec-WebSocket-Key”是否是识别“ session ”的好主意。

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

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

我建议你为你的网络套接字“ session ”使用类似的东西。

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

这样,你就可以使用像 https://github.com/joewalnes/reconnecting-websocket 这样的javascript在您的应用程序代码中提供网络弹性。

希望这可以帮助。

关于websocket - 使用 Sec-WebSocket-Key 来识别 websocket 客户端连接是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18224528/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com