使用shelf_auth我可以通过这种方式从请求中提取当前用户信息:
getAuthenticatedContext(request)
.map((ac) => ac.principal.name)
.getOrElse(() => 'guest')
但是,显然,我需要一个工作请求:) 另一方面,使用shelf_web_socket,建立websocket连接执行如下处理程序:
handleWS(CompatibleWebSocket ws){
// Here I should get user from getAuthenticatedContext()
// but I cannot due to absence of Request here.
ws.messages.listen(...);
};
rootRouter.get('/ws', webSocketHandler(handleWS), middleWare: authMiddleware);
但是我不知道如何将原始套接字连接请求转发到我的handleWS,以便能够知道哪个用户刚刚连接到服务器。
另一个问题是,存储这些开放套接字的最佳做法是什么,能够向所有连接的客户端发送广播消息,以及在关闭时删除相应的套接字。
首先,我想到的是将套接字存储在Map<int,CompatibleWebSocket>
这样的地图中,其中int是CompatibleWebSocket.hash()
。
然后我可以迭代Map.values()
进行广播,并在连接关闭时按键删除。
如果这种技术过于复杂,并且可能存在更方便的方式,例如将它们存储在列表中,我无法得到?或者我可以以某种方式加入Streams进行广播吗?