是否有Spring WebSocketSession存储库?

时间:2016-03-01 17:06:50

标签: 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版中添加的,未在the chapter on WebSockets中记录。 (在“什么是新的”下提到a bullet point

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

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

请注意,对于未来的读者,SimpUserRegistry假定您已在HTTP级别对用户进行了身份验证,并且该用户由请求Principal定义。如果您发现自己有一个空的用户注册表,即使您有良好的STOMP连接,那么您可能无法验证代码所需的方式。

请参阅authentication under web sockets的最后一部分:

  

请注意,即使STOMP CONNECT帧具有“登录”和   可以用于身份验证的“密码”标头,Spring的STOMP   WebSocket支持忽略它们,目前期望用户拥有它们   已通过HTTP验证。

以上所有内容仍然使用close()方法阻止访问底层Web套接字会话。我怀疑我在WebSocket上的采用有点早,我所看到的是对上层协议(STOMP)级别的良好支持,但不太完全充实地支持在较低的Web Socket层进行自定义。

我仍在寻找一种方法来影响基于上层活动的低级Web Socket连接,例如非授权消息或TTL后无法连接。

0 个答案:

没有答案
相关问题