当前位置: 首页 > news >正文

第5篇:websocket http握手拦截器HandshakeInterceptor 介绍和使用

作用:在 WebSocket建立连接前的 HTTP 握手阶段进行拦截,用于验证、授权或传递上下文信息。

关键时机:发生在客户端发起 WebSocket 连接请求(HTTP Upgrade 请求)时,连接尚未真正建立。

典型场景:
身份校验:检查用户是否登录(如验证 Token、Cookie)。
权限控制:判断用户是否有权建立该 WebSocket 连接。
参数提取:从 URL 或请求头中提取必要参数(如房间 ID、用户 ID),存入 attributes 供后续 WebSocket 会话使用。
拒绝非法连接:不符合条件的请求直接拒绝握手,不建立 WebSocket 连接。

简单说:它是 WebSocket 连接的“安检门”,决定让不让进,以及进门时带什么信息




示例从请求头(如 Authorization: xxx)提取 Token 并 验证 用户是否合法

1 编写一个拦截器类验证token , 并往 attributes 放入数据,供后续会话使用

import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.HandshakeInterceptor; import java.util.Map; @Component public class hand_interceptor_v1 implements HandshakeInterceptor { /** * 在握手之前执行该方法, 继续握手返回true, 中断握手返回false */ @Override public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception { if(serverHttpRequest instanceof ServletServerHttpRequest){ ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) serverHttpRequest; HttpServletRequest httpServletRequest = serverRequest.getServletRequest(); // 从查询参数中获取 Authorization String authParam = httpServletRequest.getParameter("Authorization"); //替换为你的实际 Token 验证逻辑(如 JWT 解析、查 Redis 等) if (authParam != null && authParam.startsWith("xiaopengyou_")) { //设置值,将用户名存入 attributes,供后续 STOMP 会话使用 map.put("username", authParam); System.out.println("握手拦截器: beforeHandshake:"+authParam); return true; } } return false; } /** * 在握手之后执行该方法 */ @Override public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) { if(serverHttpRequest instanceof ServletServerHttpRequest){ ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) serverHttpRequest; System.out.println("握手拦截器: afterHandshake:"); } } }

2 轻量级用户身份标识,不依赖 Spring Security

import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import java.security.Principal; /** * 轻量级用户身份标识,不依赖 Spring Security */ @Getter @RequiredArgsConstructor @EqualsAndHashCode public class UserPrincipal implements Principal { private final String name; @Override public String getName() { return this.name; } }

3WebsocketConfig配置拦截器addInterceptors(new HttpHandShakeIntecepter())

@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Autowired private hand_interceptor_v1 handInterceptorV1 ; @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws") // 配置拦截器,关键注意这2个方法 .addInterceptors(handInterceptorV1) .setHandshakeHandler(new DefaultHandshakeHandler() { @Override protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) { // 从 attributes 取出 username String username = (String) attributes.get("username"); // 包装成 Spring Security 的 Principal(即使没用 Security 也能用) return username != null ? new UserPrincipal(username) : null; } }) .setAllowedOriginPatterns("*") .withSockJS(); } }

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

import org.springframework.context.event.EventListener; import org.springframework.messaging.simp.stomp.StompHeaderAccessor; import org.springframework.stereotype.Component; import org.springframework.web.socket.messaging.SessionConnectEvent; import org.springframework.web.socket.messaging.SessionSubscribeEvent; @Component public class WebSocketEventListener_v1 { @EventListener public void onApplicationEvent_1(SessionConnectEvent event) { StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage()); System.out.println("【ConnectEventListener监听器事件 类型】"+headerAccessor.getCommand().getMessageType()); //方式1,上面的配置类做了设置 System.out.println("headerAccessor.getUser() = " + headerAccessor.getUser().getName()); //方式2 ,一般的参数用这种 String username = headerAccessor.getSessionAttributes().get("username").toString(); System.out.println("【ConnectEventListener监听器事件 获取用户名为】"+username); } @EventListener public void onApplicationEvent_2(SessionSubscribeEvent event) { StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage()); System.out.println("【SubscribeEventListener监听器事件 类型】"+headerAccessor.getCommand().getMessageType()); System.out.println("headerAccessor.getUser() = " + headerAccessor.getUser().getName()); String username = headerAccessor.getSessionAttributes().get("username").toString(); System.out.println("【SubscribeEventListener 监听器类 获取用户名为】"+username); } }

4 启用客户端开始测试,如果客户端没有传递Authorization则无法连接
连接成功后,控制台能看出执行的顺序从拦截器里取值

握手拦截器: beforeHandshake:xiaopengyou_205093 握手拦截器: afterHandshake: 【ConnectEventListener监听器事件 获取用户名为】xiaopengyou_205093 【SubscribeEventListener 监听器类 获取用户名为】xiaopengyou_205093
http://www.jsqmd.com/news/472685/

相关文章:

  • springboot基于JavaWeb的网络流量数据样本管理系统2s55x231
  • 告别低效!Windows 部署 OpenClaw,解锁你的私人 AI 数字员工
  • 005、体系结构之TiKV_Raft日志
  • websocket 随手记
  • asp毕业设计—— 基于asp+access的网络招聘管理系统设计与实现(毕业论文+程序源码)——网络招聘管理系统
  • 探索AI视觉新高度:MMDetection深度学习框架详解
  • asp毕业设计—— 基于asp+access的网上动态同学录系统设计与实现(毕业论文+程序源码)——同学录系统
  • 第6篇:websocket 频道消息拦截器ChannelInterceptor 介绍和使用
  • 006、体系结构之TiKV读取和Coprocessor
  • python + word
  • C#毕业设计——基于C#+asp.net+SVG的基于SVG的自动站雨量分析系统设计与实现(毕业论文+程序源码)——雨量分析系统
  • 第3篇 附录:Spring Boot + WebSocket + 消息队列STOMP协议 示例-- 只有 前台页面
  • 探索Mask R-CNN:深度学习中的图像分割神器
  • Hive中rlike,like区别与使用详解
  • MAPPO动作类型改进(二)——MAPPO+连续环境
  • 2026年南京名酒回收市场选择参考:茅台、老酒、虫草及礼品回收服务指南 - 海棠依旧大
  • 多模态跟踪怎么搞?清华西电TPAMI 2025新方法深度解析,从小白到大神,吃透这一篇就够了!
  • 【Mutilism用传输门搭建D触发器/与非门/或非门】2022-3-11
  • C#毕业设计——基于C#+asp.net+SQL Server的课程指导平台设计与实现(毕业论文+程序源码)——课程指导平台
  • 2026年3月南京名酒回收机构选择指南:茅台回收、老酒回收、洋酒回收、红酒回收、虫草回收机构 - 海棠依旧大
  • 笔试题-_-
  • Simpleperf 性能工具介绍app_profiler.py -i perf.data
  • C#毕业设计——基于C#+asp.net+SQL server的通用作业批改系统设计与实现(毕业论文+程序源码)——作业批改系统
  • 2026年江苏名酒回收机构推荐榜:名酒 / 老酒 / 虫草回收、上门服务、商家选择指南,盛鑫回收用专业鉴定守护靠谱交易 - 海棠依旧大
  • anaconda常用指令
  • “水莲花数”
  • 2026年成都/自贡/内江/泸州/宜宾/乐山/四川/云南云梯车、高空车、吊车、挖掘机、压路机、铲车租赁市场盘点:如何甄选可靠服务伙伴? - 2026年企业推荐榜
  • Ubuntu 22.04 搭建onlyoffice私服
  • 欧洲智慧零售及无人店铺展代理:好评度高选择策略解析
  • Logstash 项目教程:从零开始构建数据管道