![](/img/trans.png)
[英]Spring websocket(stomp, sockjs): Controller didn't get whole data
[英]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.