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
获得。