【问题标题】:Request or Session scope in Spring WebsocketSpring Websocket 中的请求或会话范围
【发布时间】:2015-08-10 10:03:17
【问题描述】:

我尝试从 WebSocket 端点调用单例服务。 但我无法使用 WebSocket 的请求或会话范围。

(@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS))

我得到 范围“请求”对于当前线程不活动; 对于任何“ScopedProxyMode”上的“请求”或“会话”范围。

感谢您的帮助!

【问题讨论】:

    标签: spring scope spring-websocket


    【解决方案1】:

    对于 Web 套接字,没有请求/响应,因此请求范围无效。他们在 Spring 4.1 中引入了称为 websocket 的新范围。 @Scope(name = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)。示例参考链接

    http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#websocket-stomp-websocket-scope

    【讨论】:

    • 虽然我知道这个新范围,但它无助于检索外部会话范围中已经存在的数据(例如当前登录的用户)。任何想法如何访问它?我的客户端在其初始连接的 http 握手期间发送与我的服务器会话范围关联的 cookie,但我如何从 Spring 中找到该范围?
    【解决方案2】:

    我不确定 Spring,但是如果您根据 JSR-356 标准(spring 应该理解)构建 Web 套接字代码,则可以将自定义配置器添加到端点定义中,您可以在其中拦截握手。请参阅javax.websocket.server.ServerEndpointConfig.Configurator.modifyHandshake(ServerEndpointConfig, HandshakeRequest, HandshakeResponse),然后您可能能够掌握实际的会话对象,但这取决于您的应用程序服务器。你绝对可以得到任何参数和标题。

    这是直接的答案,但更好的设计方法是首先消除对会话的任何依赖。

    【讨论】:

      【解决方案3】:

      你可以使用

      @Scope(name = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
      

      但它也是单例,而不是会话范围。 https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/websocket.html

      【讨论】:

        猜你喜欢
        • 2014-03-06
        • 1970-01-01
        • 2011-09-02
        • 2014-12-02
        • 2017-05-09
        • 2012-01-07
        • 2011-09-06
        • 2016-01-02
        • 2012-05-26
        相关资源
        最近更新 更多