java - 处理 STOMP SEND 时在 Spring 中获取 Websocket session 数据

标签 java spring session websocket spring-websocket

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/

相关文章:

javascript - Google Analytics - GA 在删除 Cookie 后如何跟踪用户?

java - SpringMVC REST Web 服务

java - 无法在spring boot中使用内存数据库

java - Spring 在使用 find 访问对象时是否应该启动事务?

java - Oracle 查询之间不采用结束日期时间

php - 如何将新的数组值插入PHP session 数组?

c# - SessionManager 和 Session 随机为 null

java - Apache Storm - Spout/Bolt 因高延迟而崩溃

java - 如何在 javaFX 中将光标更改为 WAIT 的同时线程化后台任务?

java - 从类名数组创建类