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 session 数据?
最佳答案
那么,您可以通过将 org.springframework.messaging.simp.stomp.StompHeaderAccessor
参数添加到您的 handle(String)
来获取 websocket 的 session 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)
}
这里的主要思想是拦截初始握手并将真实 session ID 存储在 websocket 属性中。这些属性可通过传递给 handle(String, StompHeaderAccessor)
方法的 StompHeaderAccessor
获得。
关于java - 处理 STOMP SEND 时在 Spring 中获取 Websocket session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41286714/