处理 STOMP SEND 时在 Spring 中获取 Websocket 会话数据

     2023-02-16     254

关键词:

【中文标题】处理 STOMP SEND 时在 Spring 中获取 Websocket 会话数据【英文标题】:Get Websocket session data in Spring when handing STOMP SEND 【发布时间】:2016-12-22 15:36:45 【问题描述】:

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 会话数据?

【问题讨论】:

【参考方案1】:

好吧,您可以通过在您的handle(String) 方法中添加org.springframework.messaging.simp.stomp.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)

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

【讨论】:

谢谢,我不知道如何使用 StompHeaderAccessor,但我已将 @Headers Map&lt;String, Object&gt; headers 参数添加到使用 @MessageMapping 注释的方法中,看起来它正在工作。 HandshakeInterceptor 中设置的属性存储在simpSessionAttributes 键下的嵌套映射中。 很高兴知道 :) 谢谢。

Spring 4 - websocket 消息传递 stomp 处理程序

】Spring4-websocket消息传递stomp处理程序【英文标题】:Spring4-websocketmessagingstomphandler【发布时间】:2014-03-0607:17:54【问题描述】:我正在尝试spring提供的教程-messaging-stomp-websocket并且效果很好现在我想扩展this并添加拦截通道的WebSoc... 查看详情

使用同步时在 Spring 分区中出现意外

...5:47【问题描述】:我正在使用SpringBatch和Partition进行并行处理。用于db的Hibernate和SpringDataJpa。对于分区步骤,读取器、处理器和写入器具有步进范围,因此我可以向它们注入分区键和范围(从到)。现在在处理 查看详情

springboot/spring中建立websocket连接(stomp)(代码片段)

...CT断开STOMPOverWebSocket:http://jmesnil.net/stomp-websocket/doc/1,SpringBoot添加基于STMOP协议的WebSocket支持1.1,添加pom依赖<dependency><groupId>org.springframework.boot&l 查看详情

使用 STOMP/WebSockets/Spring 从 @SubscribeMapping 返回原始字符串

...我有一个使用STOMPoverwebsockets的Spring-MVC控制器。除了订阅时在我的STOMPJavaScript客户端 查看详情

如何使用spring-boot处理越来越多的stomp主题

...时间然后被遗忘,其他人来了。我无法找到有关Spring如何处理创建主题的信息,更具体地说:是否可以创建最大数量或主题?动态创建的主题会发生什么,没有更多订阅者, 查看详情

使用同步时在 Spring 分区中出现意外

...0:34【问题描述】:我正在使用SpringBatch和Partition进行并行处理。用于db的Hibernate和SpringDataJpa。对于分区步骤,读取器、处理器和写入器具有stepscope,因此我可以向它们注入分区键和范围(从到)。 查看详情

在 Spring 中访问 Stomp 标头

】在Spring中访问Stomp标头【英文标题】:AccessingStompHeadersinSpring【发布时间】:2017-01-2410:39:17【问题描述】:我想在stomp标头中设置一个用户名,并在握手期间将该用户名设置在Principal对象中。创建了我自己的HandshakeHandler,但我... 查看详情

Spring Websocket STOMP 负载测试

.../压力测试。但是,我们想知道SpringWebsocket/STOMP端点可以处理多少消息 查看详情

在一个请求中从 JS 到 Spring 的多个 STOMP 订阅

】在一个请求中从JS到Spring的多个STOMP订阅【英文标题】:MultipleSTOMPsubscriptionsfromJStoSpringinonerequest【发布时间】:2019-07-1506:21:30【问题描述】:目标是使用Web界面和Spring框架进行多房间聊天。看起来STOMP超过SockJS是此类项目的最... 查看详情

springboot/spring中建立websocket连接(stomp)(代码片段)

STOMP协议介绍STOMP,StreamingTextOrientatedMessageProtocol,是流文本定向消息协议,是一种为MOM(MessageOrientedMiddleware,面向消息的中间件)设计的简单文本协议。它提供了一个可互操作的连接格式,允许STOMP客户端与任意... 查看详情

使用 Stomp 在 Spring Boot 中访问 JWT 令牌

】使用Stomp在SpringBoot中访问JWT令牌【英文标题】:AccessJWTtokeninSpringBootwithStomp【发布时间】:2022-01-1416:31:49【问题描述】:我已经按照thisguide设置了ng2-stompjs,但是在我的Spring引导后端遇到问题,因为我使用的是JWT令牌。首先,... 查看详情

没有 SockJS/StompJS 的 Spring STOMP 服务器

...有支持SpringWebsocket的Spring服务器。我想使用STOMP子协议来处理web套接字上的通信,所以STOMP端点的配置如下:@Configuration@EnableWebSocketMessageBro 查看详情

使用 Stomp PHP 库连接到 Spring websockets (stomp)

】使用StompPHP库连接到Springwebsockets(stomp)【英文标题】:ConnectwithaStompPHPlibrarytoSpringwebsockets(stomp)【发布时间】:2014-08-0815:12:24【问题描述】:我已经编译并运行了本指南中的代码:http://spring.io/guides/gs/messaging-stomp-websocket/我想使... 查看详情

我正在使用 websocket 在与 Spring Boot 和 STOMP 客户端与 js 聊天中发送图像

】我正在使用websocket在与SpringBoot和STOMP客户端与js聊天中发送图像【英文标题】:IamusingwebsockettosendimagesinachatwithspringbootandSTOMPclientwithjs【发布时间】:2021-06-2808:07:53【问题描述】:大家好,我正在使用websocket使用stomp客户端发送... 查看详情

如何在 Spring Boot 应用程序中向 STOMP CREATED 消息添加自定义标头?

】如何在SpringBoot应用程序中向STOMPCREATED消息添加自定义标头?【英文标题】:HowtoaddcustomheaderstoSTOMPCREATEDmessageinSpringBootapplication?【发布时间】:2017-06-2905:16:55【问题描述】:我正在尝试将自定义标头添加到客户端在第一次连接... 查看详情

Spring Stomp 可以发送未经请求的消息

】SpringStomp可以发送未经请求的消息【英文标题】:SpringStompCANsendunsolicitedmessages【发布时间】:2016-01-2117:43:26【问题描述】:在SpringWebSocket文档中我发现了这句话:重要的是要知道服务器不能发送未经请求的消息。http://docs.spring... 查看详情

Spring Web 套接字和 Stomp 的日志中的“会话 id 没有解码器”

】SpringWeb套接字和Stomp的日志中的“会话id没有解码器”【英文标题】:"Nodecoderforsessionid"inlogsforSpringwebsocketsandStomp【发布时间】:2017-10-0610:45:34【问题描述】:我在一台服务器上有一个带有2个实例和apache代理的tomcat集群... 查看详情

Spring 4 websocket + stomp + rabbitmq 和集群

】Spring4websocket+stomp+rabbitmq和集群【英文标题】:Spring4websocket+stomp+rabbitmqandclustering【发布时间】:2016-02-1605:39:01【问题描述】:我正在经历Spring4websocket+stomp+rabbitmq(RabbitMQ-Web-Stomp插件)架构,我有一个关于集群的问题。根据我的理... 查看详情