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库和页面刷新时套接字连接断开。为啥?

带有快速会话的 ReactJS 和 socket.io - 套接字未使用正确的会话并创建了许多其他会话

如何从 Django Channels Web 套接字数据包中获取当前用户?