Springboot配置websocket,https使用 WebSocket 连接

Springboot配置websocket,https使用 WebSocket 连接


提示:本文简单介绍websocket与http的区别及如何在项目中使用websocket,以springboot项目为例

一、http协议与websocket协议区别

  1. WebSocket

一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

用于Web应用中需要实现动态刷新的场景,大量数据定时刷新,数据轮询等操作场景,例如在线聊天、网页游戏、实时数据分析等。支持双向通信,实时性更强,更好的二进制支持,更小的控制开销:协议包头较小。同时支持扩展。

  1. HTTP

一种单向的请求-响应协议,即客户端向服务器发送请求,服务器响应后连接关闭。这种模式限制了服务器主动向客户端推送信息的能力。用户想刷新一次数据就需要请求一次后台。

HTTP更适合于传输静态内容或简单的请求-响应场景,如网页浏览。

二、使用步骤

1.引入库

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.配置websocket

代码如下(示例):创建WebSocketConfig

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

代码如下(示例):创建websocket

//注册成组件
@Component
//定义websocket服务器端,它的功能主要是将目前的类定义成一个websocket服务器端。注解的值将被用于监听用户连接的终端访问URL地址
@ServerEndpoint("/websocket")
public class WebSocket {private final static Logger log = LoggerFactory.getLogger(WebSocket.class);private Session session;// 前端请求时一个websocket时@OnOpenpublic void onOpen(Session session) {this.session = session;webSocketSet.add(this);log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size());}// 前端关闭时一个websocket时@OnClosepublic void onClose() {webSocketSet.remove(this);log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size());}// 前端向后端发送消息@OnMessagepublic void onMessage(String message) {log.info("【websocket消息】收到客户端发来的消息:{}", message);}// 新增一个方法用于主动向客户端发送消息public static void sendMessage(String message) {for (WebSocket webSocket : webSocketSet) {log.info("【websocket消息】广播消息, message={}", message);try {webSocket.session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}
}

3.消息互发
例如:在前端有一个员工表查询页面,要求实现员工表新增数据时,自动刷新员工list页面。

3.1 后台通知

public Map<String, Object> addStaff(Staff staff, Map<String, Object> resultMap) {boolean success = staffDao.addStaff(staff);if (success) {WebSocket.sendMessage("add staff data"); //通知前端resultMap.put("data", 1);} else {resultMap.put("data", 0);}return resultMap;}

3.2 前端接收消息并处理

<script type="text/javascript">var websocket = null;
// 判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:8082/websocket");
} else {alert('Not support websocket')
}
// 连接发生错误的回调方法
websocket.onerror = function() {console.log("发生错误")
};
// 连接成功建立的回调方法
websocket.onopen = function(event) {console.log("建立连接")
}
// 接收到消息的回调方法
websocket.onmessage = function(event) {console.log(event.data)//此处编写回调成功你要做的事情,例如刷新页面window.location.href ="/staff/staffPage";
}
// 连接关闭的回调方法
websocket.onclose = function() {console.log("关闭连接")
}// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function() {alert("已关闭连接");websocket.close();
}
// 关闭连接
function closeWebSocket() {alert("已关闭连接");websocket.close();
}
</script>

到这里基本上项目使用websocket动态刷新就完成了,但是这也是基于本地的项目。如果是部署到linux,使用ssl连接的情况下,这种配置又会失效,原因是在默认情况下,Websocket 的 ws 协议使用 80 端口,运行在TLS之上时,wss 协议默认使用 443 端口。其实说白了,wss 就是 ws 基于 SSL 的安全传输。

4.配置服务器https域名
nginx配置域名证书的过程不做介绍,可以参考前面的文章Nginx配置多个ssl域名项目
按照上面的理论,是不是只要将路径的ws替换成wss,路径改为域名即可呢?

websocket = new WebSocket("ws://localhost:8082/websocket");//替换前websocket = new WebSocket("wss://www.abc.com/websocket");//替换后

替换后发现报错了 This request has been blocked; this endpoint must be available over wss.
wss协议实际是websocket+ssl,是在websocket协议上加入ssl层,类似https(http+ssl),这个时候就需要检查配置的域名证书是否有效,如果证书确认没问题,还需要配置nginx

解决办法:nginx配置websocket,配置完成一定要重启nginx

server{listen       80; server_name  www.abc.com;rewrite ^(.*) https://$server_name$1 permanent; //配置带不带www都可以访问通}
server {listen       443 ssl;server_name  www.abc.com;ssl_certificate      certificate_ssl/abc.com.pem; //自己存放证书的位置ssl_certificate_key  certificate_ssl/abc.com.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;client_max_body_size 50m;location / {root   html;index  index.html index.htm;proxy_set_header x-forwarded-for  $remote_addr;proxy_pass http://127.0.0.1:8082/;#以下为websocket配置关键步骤proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-IP $remote_addr;}error_page   500 502 503 504  /upgrade.html;location = /upgrade.html {root   html;}}

不出意外应该大功告成了,如果期间还有不同报错,根据报错内容解决相关问题。


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

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

相关文章

深入浅出 Go 语言的 GPM 模型(Go1.21)

引言 在现代软件开发中&#xff0c;有效地利用并发是提高应用性能和响应速度的关键。随着多核处理器的普及&#xff0c;编程语言和框架如何高效、简便地支持并发编程&#xff0c;成为了软件工程师们评估和选择工具时的一个重要考量。在这方面&#xff0c;Go 语言凭借其创新的并…

动态规划算法设计步骤

1. 定义状态&#xff08;构建记忆表&#xff09;&#xff1a; 首先&#xff0c;需要确定问题的状态。状态可以表示为一个包含所有可能决策的变量的集合。例如&#xff0c;对于一个背包问题&#xff0c;状态可以表示为一个包含所有物品和它们的重量的数组。 2. 初始化&#xff…

Python的Pillow(图像处理库)非常详细的学习笔记

Python的Pillow库是一个非常强大的图像处理库。 安装Pillow库&#xff1a; 在终端或命令行中输入以下命令来安装Pillow&#xff1a; pip install pillow 安装后查看是否安装成功以及当前版本 pip show Pillow 升级库&#xff1a; pip install pillow --upgrade 一些基…

探索Ubuntu:从入门到精通

目录 一、什么是Ubuntu? 1.1 Ubuntu的定义和背景 1.2 Ubuntu的特点 二、安装Ubuntu 2.1 下载Ubuntu安装镜像 2.2 制作启动盘 2.3 安装Ubuntu 三、初步设置和基本操作 3.1 系统更新 3.2 安装必要软件 3.3 设置和管理用户账户 四、文件和目录管理 4.1 文件管理器 …

u-boot(六) - 详细启动流程

一&#xff0c;u-boot启动第一阶段 1&#xff0c;启动流程 ENTRY(_start) //arch/arm/lib/vectors.S ----b resets //arch/arm/cpu/armv7/start.S --------b save_boot_params ------------b save_boot_params_ret //将cpu的工作模式设置为SVC32模式&#xff08;即管理模式&a…

NodeClub:NodeJS构造开源交流社区

NodeClub&#xff1a; 连接每一个想法&#xff0c;NodeClub让社区更生动- 精选真开源&#xff0c;释放新价值。 概览 NodeClub是一个基于Node.js和MongoDB构建的社区系统&#xff0c;专为开发者和社区爱好者设计。它提供了一套完整的社区功能&#xff0c;包括用户管理、内容发…

Mongodb在UPDATE操作中使用$push向数组中插入数据

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第69篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

spark mllib 特征学习笔记 (一)

PySpark MLlib 特征处理详解 PySpark MLlib 提供了丰富的特征处理工具&#xff0c;帮助我们进行特征提取、转换和选择。以下是 PySpark MLlib 中常用的特征处理类及其简要介绍。 1. Binarizer Binarizer 是将连续特征二值化的转换器。 from pyspark.ml.feature import Bina…

Postman接口测试工具:全面解析与应用指南

标题&#xff1a;Postman接口测试工具&#xff1a;全面解析与应用指南 在当今的软件开发领域&#xff0c;接口测试是确保软件质量和稳定性的重要环节。而Postman作为一款广泛使用的接口测试工具&#xff0c;以其强大的功能和直观的操作界面赢得了开发者和测试人员的青睐。本文…

qt dll编写和调用

dll编写 新建项目 头文件 #ifndef LIB1_H #define LIB1_H#include "lib1_global.h"class LIB1_EXPORT Lib1 { public:Lib1(); };//要导出的函数&#xff0c;使用extern "C"&#xff0c;否则名称改变将找不到函数extern "C" LIB1_EXPORT int ad…

css引入方式有几种?link和@import有什么区别?

在CSS中&#xff0c;引入外部样式表的方式主要有两种&#xff1a;<link>标签和import规则。 使用<link>标签引入外部样式表&#xff1a; <link rel"stylesheet" href"path/to/style.css">这种方式是在HTML文档的<head>部分或者…

Maven:复制到自定义的目录比如target/libs目录下

拷贝依赖包 mvn dependency:copy-dependencies&#xff0c;默认会拷到项目的 target\dependency 目录&#xff0c;想要复制到自定义的目录比如target/libs目录下&#xff0c;需要在pom.xml文件中添加设置覆盖默认设置&#xff1a; <build> <plugins> <plugin&g…

探索未来边界:前沿技术引领新纪元

目录 引言 一、人工智能与深度学习&#xff1a;智慧生活的引擎 1.医疗应用 2.智能家居 3.自动驾驶 二、量子计算&#xff1a;解锁宇宙的密钥 1.量子比特示意图 2.量子计算机实物图 3.分子模拟应用 三、生物技术&#xff1a;生命科学的革新 1.CRISPR-Cas9基因编辑图 2.合成生…

buuctf----warmup_csaw_2016

进来医院先来一套常规检查 啥保护都没,看大佬说基本栈溢出 CT一看 OK cat flag 更喜欢了 40060D 找到地址 get也来了,稳啦! 0x80-0x40 8 根据上道题的exp from pwn import * ghust remote("node5.buuoj.cn",27229) addr 0x40060D payload bA * 0x40 bB*8…

C++设计模式——Bridge桥接模式

一&#xff0c;桥接模式简介 桥接模式是一种结构型设计模式&#xff0c;用于将抽象与实现分离&#xff0c;这里的"抽象"和"实现"都有可能是接口函数或者类。 桥接模式让抽象与实现之间解耦合&#xff0c;使得开发者可以更关注于实现部分&#xff0c;调用…

[C++] 编译期间生成一个元素等差的std::initializer_list

前因 写编译器的时候需要一个常量英文字母表&#xff0c;懒得26个字母一个个打了&#xff0c;于是搓了个板子。 源代码 // c14 required #include <initializer_list> #include <type_traits>template <typename _Tp, _Tp first_elem, int item_number, type…

具有不确定性感知注意机制的肺结节分割和不确定区域预测| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 Lung Nodule Segmentation and UncertainRegion Prediction With an Uncertainty-Aware Attention Mechanism 具有不确定性感知注意机制的肺结节分割和不确定区域预测 01 文献速递介绍 肺结节分割在肺癌计算机辅助诊断&#xff08;CAD&#xff09;系统中至关重…

java Springboot网上音乐商城(源码+sql+论文)

1.1 研究目的和意义 随着市场经济发展&#xff0c;尤其是我国加入WTO &#xff0c;融入经济全球化潮流&#xff0c;已进入国内外市场经济发展新时期&#xff0c;音乐与市场联系越来越紧密&#xff0c;我国音乐和网上业务也进入新历史发展阶段。为了更好地服务于市场&#xff0…

Java与服务网格(Service Mesh):构建高效微服务架构

在微服务架构成为企业开发标准的今天&#xff0c;如何有效地管理众多微服务之间复杂的通信成为了一个挑战。服务网格作为一种解决方案&#xff0c;它通过提供一个专门的基础设施层来处理服务间通信&#xff0c;从而使得应用开发更加专注于业务逻辑而非通信细节。本文将介绍服务…

px转rem插件postcss-plugin-px2rem使用方法(浏览器缩放页面自适应)

px转rem插件postcss-plugin-px2rem使用方法&#xff08;浏览器缩放页面自适应&#xff09; 1. 常见屏幕自适应的布局 百分比布局rem布局css媒体查询在前端框架设计初期&#xff0c;应优先选择好页面布局方式 2. postcss-plugin-px2rem插件的使用 官网地址&#xff1a;https…