是否有Spring WebSocketSession存储库?

all*_*nru 6 spring websocket

我正在构建一个基于Spring 4.2的WebSocket + SockJS + STOMP服务器,并且我希望能够使用ws sessionId获取对WebSocketSession实例的引用。

我可以自己创建一个会话管理器,方法是添加一个WebSocketHandlerDecorator,以便在建立新的WebSocketSession的连接时进行注册(并在关闭时注销),但是…… 这似乎是Spring在应用程序上下文中已经创建的。

这样的bean /服务已经存在了吗?

一些背景:

我的主要用例是安全问题。我正在基于每个STOMP消息执行授权,并且未经授权的消息应导致关联WS的关闭。我可以截取消息并执行授权,但是目前无法获得对WebSocketSession的引用以将其关闭。

第二个用例;成功建立Web套接字连接后,我的协议期望X秒钟内实现STOMP CONNECT,否则我又需要关闭基础WS连接。这个有点有趣,因为它是异步的/定时的,并且没有像消息拦截器那样的自然上下文。

所有的想法和建议表示赞赏。


编辑

确实,Spring的SubProtocolWebSocketHandler类维护着一个SessionId到WebSocketSession映射,但是对该映射的所有访问都是私有的。

编辑

支持在STOMP级别跟踪用户,会话和订阅。它是在4.2版中添加的,在WebSockets一章中没有记录。(在“新功能”下提到一点

有一个SimpUserRegistry接口,可以通过名称或一组所有用户来获取用户。这些是SimpUser实例,它们通过会话ID或该用户的所有会话的集合,以SimpSession的形式公开对该用户会话的访问。从中,您可以获得代表STOMP订阅的一组SimpSubscription实例。

根据javadoc,这也应该在群集(中继代理)环境中工作。

请注意,SimpUserRegistry假定您已经在HTTP级别上对用户进行了身份验证,并且该用户是由请求主体定义的。如果您发现自己的用户注册表为空,即使您拥有良好的STOMP连接,也可能无法验证代码所需的方式。

请参阅网络套接字下身份验证的最后一部分:

请注意,即使STOMP CONNECT框架具有可用于身份验证的“ login”和“ passcode”标头,Spring的STOMP WebSocket支持也会忽略它们,并且目前希望用户已经通过HTTP进行了身份验证。


以上所有内容仍使用close()方法来阻止访问基础的Web套接字会话。我怀疑我在WebSocket上的采用还为时过早,而且我所看到的是在高层协议(STOMP)级别上的良好支持,但在底层Web Socket层上对定制的支持还不够充实。

我仍在寻找一种根据上层活动影响下层Web套接字连接的方法,例如未经授权的消息或TTL后无法连接。