如何访问"会话" Spring WebSocket处理程序中的scoped bean(不是" websocket"范围)

时间:2016-12-23 10:25:00

标签: spring-mvc websocket

在一个原始的Spring WebSocket应用程序中(不使用sockjs / STOMP或任何其他中间件),我怎样才能在HTTP会话范围内注册Spring注入bean,以便我的{{1中的代码可以使用它们豆?

请注意,我提出的问题是以下任何一个问题:

  • 如何在同一WebSocket会话的所有处理程序调用都可访问的作用域中创建bean(例如,如Request or Session scope in Spring Websocket的答案中所述)。我需要访问的bean已经存在于HTTP会话的范围内
  • 我如何(以编程方式)访问servlet容器的HTTP会话存储中的对象(我还没有尝试过这样做,但我很确定答案涉及使用{{3但是,这并没有让我注入Spring作用域的依赖项。
  • 如何使用ScopedProxy在不同范围的代码之间传递bean(例如,如HttpSessionHandshakeInterceptor所述);我已经熟悉了如何执行此操作,但尝试对WebSocketHandler执行此操作会导致错误,因为WebSocketHandler范围尚未绑定到该线程访问对象。
  • here - 再次,非常有用,但不是我目前正在努力实现的目标。

我希望做的是提供一个简单的框架,允许MVC应用程序的传统HTTP请求启动部分直接与WebSocket协议通信(用于向客户端发送简单的推送更新)。我希望能够做的是将数据从MVC控制器推送到会话范围对象,并将其从websocket处理程序中拉出来。我想从MVC控制器的角度来看这个最简单的API ,如果可以只使用会话范围的bean,那将是理想的。如果您对分享这些数据的简单方法有任何其他想法,我也希望听到这些方法不可能的情况。

1 个答案:

答案 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中会话数据的最系统的方法。