websocket http握手拦截器 介绍和使用

news/2023/6/8 7:12:09

本功能在以下项目中添加,其它相关的注释,也在此项目中
https://blog.csdn.net/qq_41712271/article/details/115217344?spm=1001.2014.3001.5501

1、编写一个类,实现一个接口HandshakeInterceptor,注意没有加 @Component

package cn.huawei.interceptor;import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import javax.servlet.http.HttpSession;
import java.util.Map;/*** 注意这里没有加 @Component,否则会报错,可能是加载顺序的关系,没有详细研究* 调用的时候,使用 new DiyWoShouLanJieQi() 的方式*/
public class DiyWoShouLanJieQi implements HandshakeInterceptor {/*** 在握手之前执行该方法, 继续握手返回true, 中断握手返回false*/@Overridepublic boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {if(serverHttpRequest instanceof ServletServerHttpRequest){ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) serverHttpRequest;//获取sessionId传递HttpSession session =  serverRequest.getServletRequest().getSession();String sessionId = session.getId();map.put("sessionId",sessionId);System.out.println("握手拦截器: beforeHandshake:"+sessionId);}return true;}/*** 在握手之后执行该方法*/@Overridepublic void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {if(serverHttpRequest instanceof ServletServerHttpRequest){ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) serverHttpRequest;//获取sessionId传递HttpSession session =  serverRequest.getServletRequest().getSession();String sessionId = session.getId();System.out.println("握手拦截器: afterHandshake:"+sessionId);}}
}

WebsocketConfig添加拦截器 addInterceptors(new HttpHandShakeIntecepter())

package cn.huawei.config;
import cn.huawei.interceptor.DiyWoShouLanJieQi;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {public void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/endpoint-websocket")// 配置拦截器.addInterceptors(new DiyWoShouLanJieQi()).setAllowedOrigins("*").withSockJS();}public void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker("/topic_1", "/topic_2", "/topic_3");registry.setApplicationDestinationPrefixes("/server_1", "/server_2");}
}

3 在两个监听器里面获取到拦截器传递的参数

package cn.huawei.listener;import org.springframework.context.ApplicationListener;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.messaging.SessionConnectEvent;/*** 监听器演示* 建立连接事件*/
@Component
public class ConnectEventListener implements ApplicationListener<SessionConnectEvent>{public void onApplicationEvent(SessionConnectEvent event) {StompHeaderAccessor headerAccessor =  StompHeaderAccessor.wrap(event.getMessage());System.out.println("【ConnectEventListener监听器事件 类型】"+headerAccessor.getCommand().getMessageType());Object sessionId = headerAccessor.getSessionAttributes().get("sessionId");System.out.println("【ConnectEventListener监听器事件 获取sessionId为】"+sessionId);}
}
package cn.huawei.listener;import org.springframework.context.ApplicationListener;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.messaging.SessionSubscribeEvent;/*** 监听器演示* 订阅事件*/
@Component
public class SubscribeEventListener implements ApplicationListener<SessionSubscribeEvent>{public void onApplicationEvent(SessionSubscribeEvent event) {StompHeaderAccessor headerAccessor =  StompHeaderAccessor.wrap(event.getMessage());System.out.println("【SubscribeEventListener监听器事件 类型】"+headerAccessor.getCommand().getMessageType());Object sessionId = headerAccessor.getSessionAttributes().get("sessionId");System.out.println("【SubscribeEventListener 监听器类 获取sessionId为】"+sessionId);}
}

4 启用客户端开始测试,在springboot的控制台,可以看出执行的顺序和结果

握手拦截器: beforeHandshake:2F31F2B59E534C8FEF5D972E62291DB3
握手拦截器: afterHandshake:2F31F2B59E534C8FEF5D972E62291DB3
【ConnectEventListener监听器事件 类型】CONNECT
【ConnectEventListener监听器事件 获取sessionId为】2F31F2B59E534C8FEF5D972E62291DB3
【SubscribeEventListener监听器事件 类型】SUBSCRIBE
【SubscribeEventListener 监听器类 获取sessionId为】2F31F2B59E534C8FEF5D972E62291DB3


 


https://dhexx.cn/news/show-17488.html

相关文章

lzugis——Arcgis Server for JavaScript API之POI

POI&#xff08;Point Of Interest&#xff09;&#xff0c;感兴趣点&#xff0c;其实呢&#xff0c;严格意义上说应该不是POI&#xff0c;但是单位就这样叫了&#xff0c;我也就这样叫了&#xff0c;其实现的功能大致是这样的&#xff1a;用过百度地图的朋友们都知道你在百度地…

websocket 多人群聊Demo ,演示握手,channel拦截器使用,并获取拦截器里的值,模拟登陆,实时显示在线用户等功能

此Demo的源码地址&#xff0c;先说明&#xff0c;仅为Demo&#xff0c;bug满天飞https://download.csdn.net/download/qq_41712271/16137309?spm1001.2014.3001.5503 本项目注释代码不多&#xff0c;更详细的注释&#xff0c;可看些项目&#xff0c;以下只列出核心代码https:/…

【软件分析与挖掘】An Empirical Study of Bugs in Build Process

摘要 对软件构建过程中所产生的错误&#xff08;build process bugs&#xff09;进行实证研究。 5个开源项目&#xff1a;CXF, Camel, Felix,Struts, and Tuscany。 把build process bugs 和 other bugs在3个维度比较&#xff1a;bug severity, bug fix time, the number of fi…

springboot+websocket+sockjs整合rabbitmq

前提条件 rabbitmq已经安装并开启了stomp插件https://blog.csdn.net/qq_41712271/article/details/115274738 此功能在这个项目中改进&#xff0c;以后消息都存储在rabbitmq中&#xff0c;websocket可以往mq里发消息&#xff0c;也可以接收mq的消息 https://blog.csdn.net/qq_4…

Kubuntu 14.10 mentohust 配置libpcap 锐捷校园网登录总结

首先需要说明&#xff0c;mentohust 和锐捷一样&#xff0c;都依赖 libpcap 这个函数库。 而配置libpcap 前&#xff0c;需要安装GCC、GNU M4 、 flex 、bison&#xff0c;不然就会报错 (以下均以 root 身份执行&#xff09; 1.安装GCCUbuntu默认安装了GCC&#xff0c;但是按照…

使用Jenkins配置自动化构建

持续集成是个简单重复劳动&#xff0c;人来操作费时费力&#xff0c;使用自动化构建工具完成是最好不过的了。 为了实现这个要求&#xff0c;我选择了Jenkins。从 http://mirrors.jenkins-ci.org/windows/latest下载windows下的最新安装版jenkins。&#xff08;如果不 能安装&a…

EF(EntityFramework) Migrations 迁移

1、开启程序包管理器控制台 2.安装EntityFrameworkPM> Install-Package EntityFramework3.启用迁移PM> Enable-Migrations –EnableAutomaticMigrations遇到的问题&#xff1a;4.创建迁移点PM> Add-Migration InitialCreate5.执行迁移点更新PM> Update-Database –…

springboot整合rabbitmq 消费者Consumer 手动进行ack确认

ack指Acknowledge&#xff0c;确认。 表示消费端收到消息后的确认方式。 有三种确认方式&#xff1a; 自动确认&#xff1a;acknowledge"none" 手动确认&#xff1a;acknowledge"manual" 根据异常情况确认&#xff1a;acknowledge"auto"&#xf…

LRU缓存实现(Java)

LRU Cache的LinkedHashMap实现LRU Cache的链表HashMap实现LinkedHashMap的FIFO实现调用示例LRU是Least Recently Used 的缩写&#xff0c;翻译过来就是“最近最少使用”&#xff0c;LRU缓存就是使用这种原理实现&#xff0c;简单的说就是缓存一定量的数据&#xff0c;当超过设定…

springboot整合rabbitmq 消费者Consumer限流

场景&#xff1a;请求瞬间增多&#xff0c;每秒5000个请求&#xff0c;防止A系统挂掉 注意&#xff1a;一定要开启手动ack确认 1 application.yml配置文件 server:port: 8021 spring:#给项目来个名字application:name: rabbitmq-test#配置rabbitMq 服务器rabbitmq:host: 127.0…