递给Stomp发送时,请在春季获取WebSocket会话数据



spring websocket教程告诉我,如果我想处理stomp send命令,我将使用(http://docs.spring.io/spring/spring/docs/docs/current/current/spring-frame-framework-reference-ramework-reference-/html/websocket.html)

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

我还需要知道哪个Websocket会话正在发送此信息,以便进行检查

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

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

好吧,您可以通过将org.springframework.messaging.simp.stomp.StompHeaderAccessor参数添加到您的handle(String)方法: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?) {}
}

并将其注册Wihtin您的 org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer so:

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

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

最新更新