簡體   English   中英

處理STOMP SEND時,在Spring中獲取Websocket會話數據

[英]Get Websocket session data in Spring when handing STOMP SEND

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會話正在發送這個,以便進行檢查

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

因此,我如何獲得此示例的Websocket Session數據?

好吧,您可以通過將org.springframework.messaging.simp.stomp.StompHeaderAccessor參數添加到handle(String)方法: handle(String, 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)
}

這里的主要思想是攔截初始握手並在websocket屬性中存儲真實會話ID。 這些屬性可以通過StompHeaderAccessor傳遞給您的handle(String, StompHeaderAccessor)方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM