基于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用过的jQuery记录

var list $(input:radio[name"name"]:checked).val();  //选择input中单选name为“name”的并且是选中状态的 index $(document).data(index);  //把参数存入document中保存起来并在下一次中取出再用index 1index $(document).data(index); str.find("input…

windows phone画板程序

前几天想要这样一个程序&#xff0c;没找到&#xff0c;今天上网偶然发现了&#xff0c;转载过来。 <Grid> <InkPresenter x:Name"MyPresenter" HorizontalAlignment"Left" VerticalAlignment"Top" MouseLeftButtonDown"MyP…

文件指针创建失败!File *fp失败

问题记录&#xff1a;项目是在所里边的vs2010上创建的&#xff0c;正常&#xff01;在自己的笔记本上使用vs13和19都一直报错&#xff01;指针一直为空&#xff01; 网上查了好久&#xff0c;试了很多方法都没有用&#xff01;最后发现是权限的问题&#xff0c;c盘下边创建不了…

前端开发:小程序--第一步

当我在接到小程序的项目的时候&#xff0c;几乎可以说是一脸懵因为对小程序的概念说实话是不太理解的&#xff0c;或者说理解的不太透彻&#xff0c;但是领导给项目说要完成&#xff0c;那没办法&#xff0c;还是要继续呀。 首先&#xff0c;我就想着先注册一个看看&#xff0…

但这是不可能的,或者无法发现JIT破坏了您的代码。

时不时地查看一些代码&#xff0c;并认为它不可能是错误的。 一旦您排除了简单的程序员搞砸代码/代码中的敌对行为&#xff08;确保您阅读Java Puzzlers或类似内容&#xff09;或并发问题&#xff08;阅读Java Concurrency或继续学习Heniz博士的出色课程 &#xff09;&#xff…

【解决】insert 语句无效果,在查询中正常运行问题

今天碰到一个奇怪的问题&#xff0c;具体见csdn&#xff1a;http://topic.csdn.net/u/20120424/19/0aeacbce-a9d5-4630-8b87-a08d5df1828b.html?seed1347097422&r78358698#r_78358698 解决方法与原因:猜测&#xff0c; 因为数据库是我再vs2010中建立的&#xff0c;数据库版…

最近开始研究和关注的技术

留个草稿&#xff0c;慢慢补充。 Acropolis&#xff0c;基于WPF的应用程序框架&#xff0c;某种角度可以认为是CAB的WPF实现&#xff1b; http://windowsclient.net/acropolis/&#xff0c;Cider似乎还是不完善......不知道VS2008 Release时能不能妥善处理好WPF在设计期的渲染。…

html行级元素和块级元素以及css转换

之前有说过html的标签是有语义的&#xff0c;当然也就有一些默认的样式&#xff0c;比如标题有h1h6&#xff0c;他们的字体由大至小一次递减&#xff0c;字体比一般字体要加粗。 这样也就有了行级元素和块级元素&#xff0c;下面来看看什么是行级元素什么事块级元素&#xff1…

EasyCriteria已演变为uaiCriteria。 新名称和更多功能

你好&#xff01;你好吗&#xff1f; 我很高兴宣布uaiCriteria的发布&#xff0c;EasyCriteria的演进。 确实需要更改框架名称吗&#xff1f; 是的&#xff0c;可悲的是。 我找到了另一个具有相同名称的框架 &#xff0c;这就是为什么我决定更改名称的原因&#xff08;我不希…

ajax方式下载文件

在web项目中需要下载文件&#xff0c;由于传递的参数比较多&#xff08;通过参数在服务器端动态下载指定文件&#xff09;&#xff0c;所以希望使用post方式传递参数。通常&#xff0c;在web前端需要下载文件&#xff0c;都是通过指定<a>标签的href属性&#xff0c;访问服…

了解Spring Web应用程序体系结构:经典方法

每个开发人员必须了解两件事&#xff1a; 架构设计是必要的。 花哨的体系结构图没有描述应用程序的真实体系结构。 真正的体系结构是从开发人员编写的代码中找到的&#xff0c;如果不设计应用程序的体系结构&#xff0c;最终将得到一个具有多个体系结构的应用程序。 这是否…

使用unicode

#include <iostream> class 我的类 { public:我的类(int 我的初始化变量){我的成员变量 我的初始化变量;}~我的类(){}int 我的成员变量;void 打印我的变量(){std::cout<<我的成员变量<<std::endl;}; };int main() {我的类 我的实例(1);我的实例.打印我的变量…

springmvc注解小示例(转)

转自&#xff1a;http://www.blogjava.net/pengo/archive/2010/11/28/339229.html 弃用了struts&#xff0c;用spring mvc框架做了几个项目&#xff0c;感觉都不错&#xff0c;而且使用了注解方式&#xff0c;可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mv…

解决maven项目Cannot change version of project facet Dynamic web module to 3.0

1、打开新建的servlet文件例如&#xff08;hibernate.cfg.xml&#xff09;修改头文件为 <?xml version"1.0" encoding"UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" &quo…

使用Forge插件在现有Java EE项目上启用Arquillian

技术提示&#xff03;34解释了如何创建可测试的Java EE 7应用程序。 如果要启动新的应用程序&#xff0c;这将很有用。 但是&#xff0c;如果您已经有一个应用程序并启用Arquillian怎么办&#xff1f; 这就是Forge和Forge-Arquillian附加组件派上用场的地方。 这就是我在javae…

HDOJ1166 敌兵布阵【线段树】

Problem : 1166 ( 敌兵布阵 ) Judge Status : AcceptedRunId : 5862942 Language : GCC Author : qq1203456195 #include <stdio.h> #define lson l,m,rt<<1 #define rson m1,r,rt<<1|1 #define maxn 55555 int sum[maxn<<2]; void PushUp(i…

欧拉回路

欧拉回路与欧拉路径 欧拉回路 不重复地结果每条边的回路欧拉路径 不重复地几个每条边地路径欧拉图 存在欧拉回路地图半欧拉图 存在欧拉路径地图在数学中为简单的图的一笔画完问题&#xff0c;但在有向图里&#xff0c;可以应用到单词接龙判断 判断是否存在欧拉回路 无向图有向图…

jQuery文档就绪

很多jQuery代码都有如下片段: $(document).ready(function(){//代码 })作用就是等文档结构加载完成后再去执行function中的代码&#xff0c;功能类似于window.onload事件。 代码实例如下: <!DOCTYPE html> <html> <head> <meta charset"utf-8"…

使用Java EE 7,WildFly和Docker进行连续部署–(第1部分)

此博客是开始一个新的hanginar&#xff08;G 结伴旅游 webi NAR&#xff09;&#xff0c;将突出解决方案&#xff0c;框架&#xff0c;应用服务器&#xff0c;工具&#xff0c;部署和更多的内容集中在Java EE的系列。 这些不是通常的会议风格独白演示&#xff0c;而是交互式ha…

URAL 1013 K-based Numbers. Version 3

URAL_1013 和URAL_1009的思路是一样的&#xff0c;只不过需要高精度&#xff0c;所以就直接用java写了。具体的一些思路可以参考我的URAL_1009的题解&#xff1a;http://www.cnblogs.com/staginner/archive/2012/05/01/2477513.html。 如果N再大一点的话&#xff0c;也可以用二…