【问题标题】:Get Websocket session data in Spring when handing STOMP SEND处理 STOMP SEND 时在 Spring 中获取 Websocket 会话数据
【发布时间】:2016-12-22 15:36:45
【问题描述】:

Spring Websocket 教程告诉我,如果我喜欢处理 STOMP SEND 命令,我将使用 (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html)

@Controller
public class GreetingController {

    @MessageMapping("/greeting") {
    public String handle(String greeting) {
    return "[" + getTimestamp() + ": " + greeting;
    }

}

但我还需要知道哪个 Websocket Session 发送了这个,以便进行检查

if (sessionIsAllowedToDoThings(sessionData))   {...}

因此,我如何获取此示例的 Websocket 会话数据?

【问题讨论】:

    标签: java spring session websocket spring-websocket


    【解决方案1】:

    好吧,您可以通过在您的handle(String) 方法中添加org.springframework.messaging.simp.stomp.StompHeaderAccessor 参数来获取websocket 的会话ID(和其他字段):handle(String, StompHeaderAccessor)

    如果你想访问你真正的JSESSIONID 属性,你必须像这样创建org.springframework.web.socket.server.HandshakeInterceptor 的实现(它是用Kotlin 编写的):

    class HttpHandshakeInterceptor : HandshakeInterceptor {
    
        companion object {
            const val ATTRIBUTE_SESSION_ID = "sessionId"
        }
    
        override fun beforeHandshake(request: ServerHttpRequest, response: ServerHttpResponse, wsHandler: WebSocketHandler, attributes: MutableMap<String, Any>): Boolean {
            attributes[ATTRIBUTE_SESSION_ID] = (request as ServletServerHttpRequest).servletRequest.session.id
            return true
        }
    
        override fun afterHandshake(request: ServerHttpRequest, response: ServerHttpResponse, wsHandler: WebSocketHandler, exception: Exception?) {}
    }
    

    并在您的org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer 中注册,如下所示:

    override fun registerStompEndpoints(registry: StompEndpointRegistry) {
        registry.addEndpoint("/endpoint").addInterceptors(httpHandshakeInterceptor)
    }
    

    这里的主要思想是您拦截初始握手并将真实会话 ID 存储在 websocket 属性中。这些属性可通过您传递给handle(String, StompHeaderAccessor) 方法的StompHeaderAccessor 获得。

    【讨论】:

    • 谢谢,我不知道如何使用 StompHeaderAccessor,但我已将 @Headers Map&lt;String, Object&gt; headers 参数添加到使用 @MessageMapping 注释的方法中,看起来它正在工作。 HandshakeInterceptor 中设置的属性存储在simpSessionAttributes 键下的嵌套映射中。
    • 很高兴知道 :) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多