Springboot整合Websocket实现ws和wss连接
1. 引入pom依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.10</version>
</dependency>
2. 新建websocket配置文件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
3. 新建websocket常量配置
public class WebsocketConst {/*** 消息类型 heartcheck*/public static final String CMD_CHECK = "heartcheck";
}
4. 编写websocket代码
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
@Slf4j
@ServerEndpoint("/websocket/{userId}")
public class WebSocketServer {/**线程安全Map*/private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();//==========【websocket接受、推送消息等方法 —— 具体服务节点推送ws消息】=====================================================@OnOpenpublic void onOpen(Session session, @PathParam(value = "userId") String userId) {try {sessionPool.put(userId, session);log.info("【系统 WebSocket】有新的连接,总数为:" + sessionPool.size());} catch (Exception e) {}}@OnClosepublic void onClose(@PathParam("userId") String userId) {try {sessionPool.remove(userId);log.info("【系统 WebSocket】连接断开,总数为:" + sessionPool.size());} catch (Exception e) {e.printStackTrace();}}/*** ws推送消息** @param userId* @param message*/public void pushMessage(String userId, String message) {for (Map.Entry<String, Session> item : sessionPool.entrySet()) {//userId key值= {用户id + "_"+ 登录token的md5串}if (item.getKey().contains(userId)) {Session session = item.getValue();try {synchronized (session){log.info("【系统 WebSocket】推送单人消息:" + message);session.getBasicRemote().sendText(message);}} catch (Exception e) {log.error(e.getMessage(),e);}}}}/*** ws遍历群发消息*/public void pushMessage(String message) {try {for (Map.Entry<String, Session> item : sessionPool.entrySet()) {try {item.getValue().getAsyncRemote().sendText(message);} catch (Exception e) {log.error(e.getMessage(), e);}}log.info("【系统 WebSocket】广播消息:" + message);} catch (Exception e) {log.error(e.getMessage(), e);}}/*** ws接受客户端消息*/@OnMessagepublic void onMessage(String message, @PathParam(value = "userId") String userId) {if(!"ping".equals(message) && !WebsocketConst.CMD_CHECK.equals(message)){log.info("【系统 WebSocket】收到客户端消息:" + message);}else{log.debug("【系统 WebSocket】收到客户端消息:" + message);}}/*** 配置错误信息处理** @param session* @param t*/@OnErrorpublic void onError(Session session, Throwable t) {log.warn("【系统 WebSocket】消息出现错误");t.printStackTrace();}//==========【系统 WebSocket接受、推送消息等方法 —— 具体服务节点推送ws消息】=================================================}
5. ws连接测试

6. wss连接配置
-
生成ssl证书
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 3650 -out server.crt -
nginx配置
server {listen 8443 ssl;server_name localhost;ssl_certificate /etc/nginx/conf.d/certs/server.crt;ssl_certificate_key /etc/nginx/conf.d/certs/server.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;root html;charset 'utf-8';location / {root /dsp/app/dsp-web/dist/; #你项目在系统中的路径try_files $uri $uri/ /index.html;index index.html index.htm;}# 拦截APIlocation ^~ /prod-api {proxy_pass http://dsp-gateway:9999/;proxy_redirect off;rewrite /prod-api/(.*)$ /$1 break;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 拦截websocketlocation /websocket/ {proxy_pass http://dsp-gateway:9999/;proxy_redirect off;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}} -
wss连接测试

注意:使用postman测试wss时,可能会报证书验证失败的问题,如下:

可能是SSL认证拦截了请求,可以在postman的 设置 中将 SSL certificate verification关闭。

相关文章:
Springboot整合Websocket实现ws和wss连接
1. 引入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.10</version> </dependency>2. 新建websocket配置文件 import org.springf…...
CSC联合培养博士申请亲历|联系外导的详细过程
在CSC申报的各环节中,联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章,非常详细且真实地记录了申请过程、心理感受,并提出有益的建议,小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始,其…...
没有外网Nginx如何配置如何开启https
判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl,由于服务器没有外网,可以离线安装openssl-3.0.1.tar.gz,我是在有网的服务器直接下载的,然后再上传到这台无网的服务器上 wget https://www.open…...
【Docker篇】Linux安装Docker、docker安装mysql、redis、rabbitmq
1.Linux安装docker 官方帮助文档:Install Docker Engine on CentOS | Docker Docs 1.1安装命令 # 1. 卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…...
WPF应用程序(.Net Framework 4.8) 国际化
1、新建两个资源字典文件zh-CN.xaml和en-US.xaml,分别存储中文模板和英文模板 (1) zh-CN.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&q…...
Elasticsearch:Geoshape query
Geoshape 查询可以用于过滤使用 geo_shape 或 geo_point 类型索引的文档。 geo_shape 查询使用与 geo_shape 或 geo_point 映射相同的索引来查找具有与查询形状相关的形状的文档,并使用指定的空间关系:相交(intersect)、包含(con…...
安装配置sqoop
一、了解Sqoop 1、Sqoop产生的原因 A. 多数使用hadoop技术的处理大数据业务的企业,有大量的数据存储在关系型数据中。 B. 由于没有工具支持,对hadoop和关系型数据库之间数据传输是一个很困难的事。 以上是sqoop产生的主要原因,也因此Sqoop主要用于hadoop与关系型数据库之…...
数据结构——实验01-线性表的链式存储和操作
一、实验内容 二、算法思想与算法实现 1、解题思想 (1)逆序创建链表La就是使用头插法创建一个链表,所谓头插法就是在创建链表时始终将新元素插入到头结点之后,而正序创建链表Lb就是使用尾插法创建一个链表,所谓尾插法…...
十分钟上手vue!
Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 一 vue.js的导入及使用 vue安装…...
day37WEB攻防-通用漏洞XSS跨站权限维持钓鱼捆绑浏览器漏洞
目录 XSS-后台植入 Cookie&表单劫持(权限维持) 案例演示 XSS-Flash 钓鱼配合 MSF 捆绑上线 1、生成后门 2、下载官方文件-保证安装正常 3、压缩捆绑文件-解压提取运行 4、MSF 配置监听状态 5、诱使受害者访问 URL-语言要适当 XSS-浏览器网马…...
【Java程序设计】【C00215】基于SSM的勤工助学管理系统(论文+PPT)
基于SSM的勤工助学管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这个一个基于SSM的勤工助学管理系统,本系统共分为三种权限:管理员、教师和学生 管理员:首页、个人中心、教师管理、学生管理…...
c#的反汇编对抗
文章目录 前记nim攻防基础FFI内存加载加解密、编码 后记C#类型转换表nim基础 前记 随便编写一个c#调用winapi并用vs生成dll,同时用csc生成exe using System; using System.Runtime.InteropServices; namespace coleak {class winfun{[DllImport("User32.dll")]publ…...
设计模式之框架源码剖析(实战+图解)
Java设计模式 1,概述 随着软件开发人员人数的增多,一些公司急需一些高端人才。作为一个高端人才,设计面向对象软件是必不可少的能力,而软件设计是需要很深的功力,设计模式就要求你必须掌握。 2,本章特色…...
SQL注入:sqli-labs靶场通关(1-37关)
SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 SQL注入:盲注-CSDN博客 SQL注入:二次注入-CSDN博客 SQL注入:order by注入-CSDN博客 …...
浙政钉(专有钉钉)
专有钉钉是浙政钉的测试版本,可在正式发布之前进行业务开发。 专有钉钉 原名政务钉钉 是高安全、强管控、灵活开放的面向大型组织专有独享的协同办公平台。支持专有云、混合云等多种方式灵活部署,以满足客户特定场景所需为目标,最大化以“平…...
【lesson2】定长内存池的实现
文章目录 介绍定长内存池的设计定长内存池的实现需要成员变量需要的成员函数定长内存池结构定长内存池Delete(释放空间)的实现定长内存池New(申请空间)的实现 定长内存池的实现完整版 介绍 作为程序员(C/C)我们知道申请内存使用的…...
C++迷宫游戏详解
个人主页:[PingdiGuo_guo] 收录专栏:[C干货专栏] 大家好呀,我是PingdiGuo_guo,今天我们来学习用C实现一个迷宫游戏。 目录 1.迷宫的具体步骤 1.1.迷宫的初始化 1.2.寻路算法 1.DFS算法 2.BFS算法 1.3.移动 2.总结 C迷宫游…...
java下载网络文件
/*** 下载文件** param fileId* param response* throws Exception*/ GetMapping("/downLoadFile") public void downLoadFile(Long fileId, HttpServletResponse response) throws Exception{// 根据文件ID查询文件路径FileDO fileDO fileService.get(fileId);// 定…...
大数据信用报告查询费用一般要多少钱?
一些不少朋友在申贷的时候被拒贷之后,得到的原因就是因为大数据不良被拒,这时候很多人都反过来查询自己的大数据信用报告,而查询的价格也是不少朋友都比较关注的,那大数据信用报告查询费用一般要多少钱呢?下面本文就为你介绍一下…...
【操作宝典】IntelliJ IDEA新建maven项目详细教程
目录 🌼1. 配置maven环境 🌼2. 创建maven项目 🌼3. 创建maven项目完整示例 a. 导入spring boot环境 b. 修改maven配置 c. 下载jar包 d. 创建Java类 🌼1. 配置maven环境 【安装指南】maven下载、安装与配置详细教程-CSDN博客…...
别再只靠瓦片等级了!用Cesium精准控制地图缩放的自定义比例尺方案
突破瓦片等级限制:Cesium动态比例尺的工程实践与业务集成 在三维地理信息系统的开发中,地图缩放控制一直是个既基础又关键的课题。传统依赖预定义瓦片等级的做法,就像用固定档位的变速箱驾驶越野车——虽然简单直接,但面对复杂地形…...
终极指南:Everything Claude Code JPA模式的AI驱动最佳实践 [特殊字符]
终极指南:Everything Claude Code JPA模式的AI驱动最佳实践 🚀 【免费下载链接】everything-claude-code The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, …...
上海文化墙设计:让空间成为品牌价值的视觉表达
在企业品牌建设中,视觉空间的设计与呈现正在成为传递企业价值观、增强员工认同感和提升品牌形象的关键载体。特别是在上海这样的商业中心,企业文化墙的设计需求日益增长,如何在有限的空间内实现品牌故事的立体化表达,成为许多企业…...
GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路闲
1. 流图:数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调…...
Windows电脑突然变卡?手把手教你排查Artemis僵尸网络(附注册表修复脚本)
Windows系统异常卡顿?可能是Artemis僵尸网络在作祟 最近电脑突然变得异常缓慢,任务管理器打不开,甚至文件夹选项也消失了?这可能是Artemis僵尸网络在背后捣鬼。作为一名长期与Windows系统打交道的技术顾问,我见过太多用…...
GitHub 智能汉化插件:高效消除英文界面障碍的终极方案
GitHub 智能汉化插件:高效消除英文界面障碍的终极方案 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese GitHub 作为全球最大…...
从零入门RAG:手把手教你构建大模型知识增强系统
本文深入解析RAG(检索增强生成)技术,阐述其解决大模型知识缺失、滞后及幻觉问题的核心优势,对比RAG与微调、Agent的适用场景,并拆解RAG的九步实现流程及四大核心组件(知识嵌入、向量数据库、检索器、生成器…...
3个黑科技解决百度网盘限速难题:开源工具实现本地优化加速
3个黑科技解决百度网盘限速难题:开源工具实现本地优化加速 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 你是否经历过这样的场景…...
3分钟解锁OBS直播新玩法:免费RTSP服务器插件完全指南
3分钟解锁OBS直播新玩法:免费RTSP服务器插件完全指南 【免费下载链接】obs-rtspserver RTSP server plugin for obs-studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-rtspserver 还在为OBS直播流无法接入监控系统而烦恼吗?想要让专业直播…...
开源工具Unlock Music:本地解密技术如何重塑音乐文件控制权
开源工具Unlock Music:本地解密技术如何重塑音乐文件控制权 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: …...
