我最近参与了一个项目,我们需要捕获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相关推荐

  1. 【java毕业设计】基于Spring Boot+mysql的线上教学平台系统设计与实现(程序源码)-线上教学平台

    基于Spring Boot+mysql的线上教学平台系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的线上教学平台系统设计与实现,本论文只截取部分文章 ...

  2. 【java毕业设计】基于Spring Boot+mysql的酒店管理系统设计与实现(程序源码+毕业论文)-酒店管理系统

    基于Spring Boot+mysql的酒店管理系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的酒店管理系统设计与实现,本论文只截取部分文章重点,文 ...

  3. 【java毕业设计】基于Spring Boot+mysql的口腔管理平台系统设计与实现(程序源码)-口腔管理平台

    基于Spring Boot+mysql的腔管理平台系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的腔管理平台系统设计与实现,本论文只截取部分文章重点 ...

  4. 基于 Spring Boot + Cloud 构建微云架构

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 ...

  5. 基于Spring Boot+Cloud构建微云架构

    链接:my.oschina.net/u/3636867/blog/1802517 前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而 ...

  6. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

  7. 基于 Spring Boot 和 Spring Cloud 实现微服务架构

    前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而来,很多描述的重点也都偏向于作者自身碰到的问题,这样就很容易让你理解和操作出现偏差 ...

  8. 基于Spring Boot和Spring Cloud实现微服务架构学习

    目录 Spring 顶级框架 Spring cloud子项目 WHAT - 什么是微服务 微服务简介 微服务的具体特征 SOA vs Microservice HOW - 怎么具体实践微服务 客户端如 ...

  9. 基于Spring boot,使用idea方便地切换启动环境

    https://blog.csdn.net/mate_ge/article/details/78624579 基于Spring boot,使用idea方便地切换启动环境 原创martsforever ...

最新文章

  1. Linux之bash编程基本语法
  2. 终于明白 Java 为什么要加 final 关键字了!
  3. ng2项目启动过程出现‘getSymbolByModule' of undefined‘错误
  4. linux redis经常自动关闭,Linux开启关闭redis
  5. Original error was: DLL load failed: 找不到指定的模块。--解决办法
  6. python3 os模块
  7. linux安装libfastcommon+fastdfs+nginx
  8. PowerBI随笔(2)-分组依据进行分组汇总
  9. Windows 10 修改网络名字
  10. Qt之QSS:带CheckBox的QGroupBox及其样式设计
  11. C#_基础_部分类partial(十八)
  12. 北京内推 | 微软亚洲研究院机器学习组招聘NLP/语音合成等方向全职研究员
  13. 【无标题】简单的培根密码解密
  14. 【论文笔记】AliMe Assist阿里小蜜(未完。。。)
  15. Hadoop是什么?基本概念
  16. 一个有趣的字符滚动GIF动态验证码识别
  17. c语言实现定积分运算
  18. 操作系统期末复习-第一章:操作系统概论
  19. 【自动控制原理】根轨迹Root Locus-笔记
  20. html5圣诞贺卡,用CorelDRAW制作漂亮别致的圣诞贺卡

热门文章

  1. javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
  2. Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
  3. jquery中获取下拉框的文本值
  4. 系统架构设计师考试 重要的部分
  5. python变量后面加星号_Python基础找茬系列20--python函数的秘密
  6. 编译内核_将驱动编译进内核(Kernel)的步骤记录
  7. pdfbox java.lang.outofmemoryerror_Apache PDFBox 1.8.11 发布,Java 的 PDF 处理类
  8. 炒菜机器人的弊端_机器人炒菜真不是你想的那样!
  9. ReviewForJob(1)数据结构与算法分析引论
  10. orelse_可选的orElse vs orElseGet