在一个原始的Spring WebSocket应用程序中(不使用sockjs / STOMP或任何其他中间件),我怎样才能在HTTP会话范围内注册Spring注入bean,以便我的{{1中的代码可以使用它们豆?
请注意,我不提出的问题是以下任何一个问题:
WebSocketHandler
执行此操作会导致错误,因为WebSocketHandler
范围尚未绑定到该线程访问对象。我希望做的是提供一个简单的框架,允许MVC应用程序的传统HTTP请求启动部分直接与WebSocket协议通信(用于向客户端发送简单的推送更新)。我希望能够做的是将数据从MVC控制器推送到会话范围对象,并将其从websocket处理程序中拉出来。我想从MVC控制器的角度来看这个最简单的API ,如果可以只使用会话范围的bean,那将是理想的。如果您对分享这些数据的简单方法有任何其他想法,我也希望听到这些方法不可能的情况。
答案 0 :(得分:1)
您还可以将Java API用于websocket。这个链接https://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-support 解释了如何使用Spring执行此操作。 不幸的是,这样的事情
@ServerEndpoint(value = "/sample", configurator = SpringConfigurator.class)
public class SampleEndpoint {
private SessionScopedBean sessionScopedBean;
@Autowired
public SampleEndpoint(SessionScopedBean sessionScopedBean) {
this.sessionScopedBean = sessionScopedBean;
}
}
导致异常(因为我们试图访问其范围之外的bean),但对于单例和原型bean,它运行良好。
要使用会话属性,您可以修改hanshake并传递必需的属性:
public class CustomWebSocketConfigurator extends SpringConfigurator {
@Override
public void modifyHandshake(ServerEndpointConfig config,
HandshakeRequest request,
HandshakeResponse response) {
//put attributes from http session to websocket session
HttpSession httpSession = (HttpSession) request.getHttpSession();
config.getUserProperties().put("some_attribute",
httpSession.getAttribute("some_attribute_in_http_session"));
}
}
P上。 S.更多评论而不是答案。我只想添加另一种方法来处理websocket中的会话属性到你的问答。我一直在网上搜索完全相同的问题,上面显示的方式在我看来是处理websocket中会话数据的最系统的方法。