基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID
我最近参与了一个项目,我们需要捕获Websocket请求的http会话ID –原因是要确定使用相同基础HTTP会话的Websocket会话的数量。
这样做的方法基于利用新的spring-session模块的示例,并在此处进行描述。
捕获http会话ID的技巧是理解在浏览器和服务器之间建立Websocket连接之前,有一个通过HTTP协商的握手阶段,并且会话ID在此握手阶段传递给服务器。
Spring Websocket支持提供了一种注册HandShakeInterceptor的好方法,该方法可用于捕获http会话ID并将其设置在子协议(通常为STOMP)标头中。 首先,这是捕获会话ID并将其设置为标头的方法:
public class HttpSessionIdHandshakeInterceptor implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {if (request instanceof ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;HttpSession session = servletRequest.getServletRequest().getSession(false);if (session != null) {attributes.put("HTTPSESSIONID", session.getId());}}return true;}public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {}
}
并在Spring Websocket支持下注册此HandshakeInterceptor:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketDefaultConfig extends AbstractWebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic/", "/queue/");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/chat").withSockJS().setInterceptors(httpSessionIdHandshakeInterceptor());}@Beanpublic HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() {return new HttpSessionIdHandshakeInterceptor();}}
现在,会话ID是STOMP标头的一部分,可以将其作为STOMP标头抓取,以下是在向服务器注册订阅时抓取的示例:
@Component
public class StompSubscribeEventListener implements ApplicationListener<SessionSubscribeEvent> {private static final Logger logger = LoggerFactory.getLogger(StompSubscribeEventListener.class);@Overridepublic void onApplicationEvent(SessionSubscribeEvent sessionSubscribeEvent) {StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(sessionSubscribeEvent.getMessage());logger.info(headerAccessor.getSessionAttributes().get("HTTPSESSIONID").toString());}
}
或者可以从将websocket消息作为MessageHeaders参数处理的控制器方法中获取:
@MessageMapping("/chats/{chatRoomId}")public void handleChat(@Payload ChatMessage message, @DestinationVariable("chatRoomId") String chatRoomId, MessageHeaders messageHeaders, Principal user) {logger.info(messageHeaders.toString());this.simpMessagingTemplate.convertAndSend("/topic/chats." + chatRoomId, "[" + getTimestamp() + "]:" + user.getName() + ":" + message.getMessage());}
- 这是实现此模式的完整工作示例。
翻译自: https://www.javacodegeeks.com/2014/11/spring-boot-based-websocket-application-and-capturing-http-session-id.html
基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID相关推荐
- 【java毕业设计】基于Spring Boot+mysql的线上教学平台系统设计与实现(程序源码)-线上教学平台
基于Spring Boot+mysql的线上教学平台系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的线上教学平台系统设计与实现,本论文只截取部分文章 ...
- 【java毕业设计】基于Spring Boot+mysql的酒店管理系统设计与实现(程序源码+毕业论文)-酒店管理系统
基于Spring Boot+mysql的酒店管理系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的酒店管理系统设计与实现,本论文只截取部分文章重点,文 ...
- 【java毕业设计】基于Spring Boot+mysql的口腔管理平台系统设计与实现(程序源码)-口腔管理平台
基于Spring Boot+mysql的腔管理平台系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的腔管理平台系统设计与实现,本论文只截取部分文章重点 ...
- 基于 Spring Boot + Cloud 构建微云架构
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 ...
- 基于Spring Boot+Cloud构建微云架构
链接:my.oschina.net/u/3636867/blog/1802517 前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
- 基于 Spring Boot 和 Spring Cloud 实现微服务架构
前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而来,很多描述的重点也都偏向于作者自身碰到的问题,这样就很容易让你理解和操作出现偏差 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习
目录 Spring 顶级框架 Spring cloud子项目 WHAT - 什么是微服务 微服务简介 微服务的具体特征 SOA vs Microservice HOW - 怎么具体实践微服务 客户端如 ...
- 基于Spring boot,使用idea方便地切换启动环境
https://blog.csdn.net/mate_ge/article/details/78624579 基于Spring boot,使用idea方便地切换启动环境 原创martsforever ...
最新文章
- Linux之bash编程基本语法
- 终于明白 Java 为什么要加 final 关键字了!
- ng2项目启动过程出现‘getSymbolByModule' of undefined‘错误
- linux redis经常自动关闭,Linux开启关闭redis
- Original error was: DLL load failed: 找不到指定的模块。--解决办法
- python3 os模块
- linux安装libfastcommon+fastdfs+nginx
- PowerBI随笔(2)-分组依据进行分组汇总
- Windows 10 修改网络名字
- Qt之QSS:带CheckBox的QGroupBox及其样式设计
- C#_基础_部分类partial(十八)
- 北京内推 | 微软亚洲研究院机器学习组招聘NLP/语音合成等方向全职研究员
- 【无标题】简单的培根密码解密
- 【论文笔记】AliMe Assist阿里小蜜(未完。。。)
- Hadoop是什么?基本概念
- 一个有趣的字符滚动GIF动态验证码识别
- c语言实现定积分运算
- 操作系统期末复习-第一章:操作系统概论
- 【自动控制原理】根轨迹Root Locus-笔记
- html5圣诞贺卡,用CorelDRAW制作漂亮别致的圣诞贺卡
热门文章
- javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
- Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
- jquery中获取下拉框的文本值
- 系统架构设计师考试 重要的部分
- python变量后面加星号_Python基础找茬系列20--python函数的秘密
- 编译内核_将驱动编译进内核(Kernel)的步骤记录
- pdfbox java.lang.outofmemoryerror_Apache PDFBox 1.8.11 发布,Java 的 PDF 处理类
- 炒菜机器人的弊端_机器人炒菜真不是你想的那样!
- ReviewForJob(1)数据结构与算法分析引论
- orelse_可选的orElse vs orElseGet