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连接配置

  1. 生成ssl证书

    openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 3650 -out server.crt
    
  2. 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;}}
  3. wss连接测试
    在这里插入图片描述

注意:使用postman测试wss时,可能会报证书验证失败的问题,如下:
在这里插入图片描述

可能是SSL认证拦截了请求,可以在postman的 设置 中将 SSL certificate verification关闭。
在这里插入图片描述

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

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

相关文章

Linux笔记之bash和expect脚本中的$和$argv参数匹配

Linux笔记之bash和expect脚本中的 和 和 和argv参数匹配 —— 杭州 2024-02-03 code review! 文章目录 Linux笔记之bash和expect脚本中的 和 和 和argv参数匹配1.bash脚本2.expect脚本 1.bash脚本 在Linux的bash脚本中&#xff0c;参数和脚本文件名的变量使用方式与你提供的稍…

springboot(ssm银行柜台管理系统 银行账户管理系统Java系统

springboot(ssm银行柜台管理系统 银行账户管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&a…

曲线拟合、多项式拟合、最小二乘法

最近在做自车轨迹预测的工作&#xff0c;遇到 曲线拟合、多项式拟合、最小二乘法这些概念有点不清晰&#xff0c; 做一些概念区别的总结&#xff1a; 曲线拟合用于查找一系列数据点的“最佳拟合”线或曲线。 大多数情况下&#xff0c;曲线拟合将产生一个函数&#xff0c;可用于…

Java volatile关键字是否能保证线程安全

是的&#xff0c;Java中的volatile关键字可以用于保证线程安全。 volatile关键字的作用是确保多线程环境下的变量可见性。当一个共享变量被volatile修饰后&#xff0c;它会保证修改的值会立即被更新到主内存&#xff0c;当有其他线程需要读取这个变量时&#xff0c;它会去主内…

数论基础知识(整除,质数,合数,质因数,取模,同余)

整除 ​ 整除的定义&#xff1a;设a,b∈Z&#xff0c;a≠0。如果q∈Z&#xff0c;使得baq&#xff0c;那么就说b可被a整除&#xff0c;记作a&#xff5c;b。 ​ 若整数a除以非零整数b&#xff0c;商为整数&#xff0c;且余数为零&#xff0c; 我们就说a能被b整除&#xff08;…

蓝桥杯省赛无忧 课件70 第九次学长直播带练配套课件

01 混境之地5 02 最快洗车时间 03 安全序列 04 可构造的序列总数 05 拍照 06 破损的楼梯

Android Display显示框架整体流程

一.Android Display显示框架整体流程图

大数据环境搭建(一)-Hadoop

1. 服务器环境准备 Linux镜像: centos7.9JDK: jdk1.8.0_212Hadoop: apache-hadoop-3.3.4 创建虚拟Linux服务器 配置虚拟机&#xff0c;每台主机名与ip如下 主机名ipbd-centos01192.168.159.101bd-centos02192.168.159.102bd-centos03192.168.159.103 修改网络配置文件&…

webassembly003 ggml.js试用(暂记)

git clone https://github.com/rahuldshetty/ggml.js-examples.gitpython -m http.sever启动服务器 虽然推理运行了一会&#xff0c;但是风扇没有任何响声。 Using Examples 感觉这个有点笨拙 Instruction: {dow you know about Uncaught invalid worker function to call: …

【数据结构】双向链表 超详细 (含:何时用一级指针或二级指针;指针域的指针是否要释放)

目录 一、简介 二. 双链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项&#xff1a;帮助高效记忆 1.3 关于什么时候 用 一级指针接收&#xff0c;什么时候用 二级指针接收&#xff1f; 1.4 释放节点时&#xff0c;要将节点地址 置为NULL&#xff0…

某赛通电子文档安全管理系统 UploadFileToCatalog SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

WordPress主题YIA的文章页评论内容为什么没有显示出来?

有些WordPress站长使用YIA主题后&#xff0c;在YIA主题设置的“基本”中没有开启“一键关闭评论功能”&#xff0c;而且文章也是允许评论的&#xff0c;但是评论框却不显示&#xff0c;最关键的是文章原本就有的评论内容也不显示&#xff0c;这是为什么呢&#xff1f; 根据YIA主…

2024 高级前端面试题之 性能优化模块 「精选篇」

该内容主要整理关于 性能优化模块 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 性能优化模块精选篇 1. 性能优化方式1.1 DNS 预解析1.2 缓存1.3 使用 HTTP / 2.01.4 预加载1.5 预渲染1.6 懒执行与懒加载1.7 文件优化1.8 其他 2. 首屏…

深入了解 SOCKS5 代理、代理 IP 和 HTTP

1. 介绍 引言&#xff1a;介绍代理服务在互联网世界中的重要性和普遍性。说明本文将探讨 SOCKS5 代理、代理 IP 和 HTTP 代理的概念和作用。 2. SOCKS5 代理 解释 SOCKS5 代理的概念和工作原理。介绍 SOCKS5 协议的特点和功能。讨论 SOCKS5 代理的优点和适用场景。提及 SOCK…

决策树的相关知识点

&#x1f4d5;参考&#xff1a;ysu老师课件西瓜书 1.决策树的基本概念 【决策树】&#xff1a;决策树是一种描述对样本数据进行分类的树形结构模型&#xff0c;由节点和有向边组成。其中每个内部节点表示一个属性上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff…

和鲸科技与智谱AI达成合作,共建大模型生态基座

近日&#xff0c;上海和今信息科技有限公司&#xff08;简称“和鲸科技”&#xff09;与北京智谱华章科技有限公司&#xff08;简称“智谱AI”&#xff09;签订合作协议&#xff0c;双方将携手推动国产通用大模型的广泛应用与行业渗透&#xff0c;并积极赋能行业伙伴探索领域大…

回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测

回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测 目录 回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-B…

electron项目在内网环境的linux环境下进行打包

Linux需要的文件: electron-v13.0.0-linux-x64.zip appimage-12.0.1.7z snap-template-electron-4.0-1-amd64.tar.7z 下载慢或者下载失败的情况可以手动下载以上electron文件复制到指定文件夹下&#xff1a; 1.electron-v13.0.0-linux-x64.zip 复制到~/.cache/electron/目录下…

How to switch CRAN of R language to Tsinghua mirror in ubuntu

How to switch CRAN of R language to Tsinghua mirror in ubuntu 创建文件 touch ~/.Rprofile 添加内容 tee ~/.Rprofile <<-EOF options("repos" c(CRAN"https://mirrors.tuna.tsinghua.edu.cn/CRAN/")) EOF退出后&#xff0c;重新登录。 参考文…

什么是ACL?

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…