ktor 中的当前 Web 套接字会话
Posted
技术标签:
【中文标题】ktor 中的当前 Web 套接字会话【英文标题】:Current web socket session in ktor 【发布时间】:2021-06-02 06:17:21 【问题描述】:如何获取当前的网络套接字会话? 我有一个想法做这样的事情:
webSocket("/echo")
println("WebSocket connection")
val thisConnection = Connection(this)
val session = call.sessions.get<ConnectionToUser>()
if (session == null)
close(CloseReason(CloseReason.Codes.NORMAL, "User not authorized"))
else
call.sessions.set(session.copy(connectionId = thisConnection.id, userId = session.userId))
//Some code
但我无法在 webSocket 中设置会话。
【问题讨论】:
获取当前连接,你使用Connection(this)
有什么原因吗? WebSocketSession 接口的docs 在这里可能很有用,您可以在webSocket ...
中调用this.call
我需要能够在websocket ...
以外的其他地方访问当前的Web套接字会话,因此,我将来使用Connection(this)
通过Web套接字发送数据。
【参考方案1】:
您可以使用并发映射将用户会话存储在内存中。下面是代码示例:
typealias UserId = Int
fun main()
val sessions = ConcurrentHashMap<UserId, WebSocketServerSession>()
embeddedServer(CIO, port = 7777)
install(WebSockets)
routing
webSocket("/auth")
val userId = 123
sessions[userId] = this
webSocket("/")
val userId = 123
val session = sessions[userId]
if (session == null)
close(CloseReason(CloseReason.Codes.NORMAL, "User not authorized"))
else
println("Session does exist")
.start(wait = true)
这个解决方案的灵感来自answer。
【讨论】:
以上是关于ktor 中的当前 Web 套接字会话的主要内容,如果未能解决你的问题,请参考以下文章
Spring Web 套接字和 Stomp 的日志中的“会话 id 没有解码器”
Kotlin/Native 无法导入 io.ktor.network.selector.ActorSelectorManager
如何在sails.js 中的SocketIO 握手期间修复“此套接字没有可用的有效会话”?
如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?