一、首先得明白什么是wss协议:

可以看这篇文章:WSS、SSL 和 https 之间的关系

二、接下来就是配置wss协议了(注意:tomcat搭建https的低版本支持高版本不支持)

(1)先拿到ssl证书:我这边是用的阿里云的免费证书具体获取方法如下:

先登录阿里云官网找到SSL证书选项,然后申请免费证书,然后下载tomcat证书,具体的申请流程我就不再说明了。

大家可以参考:阿里云申请免费 SSL证书 https 的图文教程_林中明月间丶-CSDN博客_阿里云申请免费ssl证书

(2)将下载的证书导入到项目中配置环境

下载后得后的压缩包解压之后将pfx后缀的证书文件导入到项目中。(我这边是导入了多个证书文件,你们根据业务需求导入一个即可。)

然后在springboot的配置文件里面配置相应的属性(证书密码在解压后的pfx-password.txt文件中可以查看),我这边是配置了两个端口http和https都能访问该项目,同理ws和wss协议也都是支持的。

# 秘钥证书库文件所在位置
server.ssl.key-store=classpath:证书名称.pfx
# 密码
server.ssl.key-store-password=证书密码
# 秘钥证书库类型
server.ssl.keyStoreType=PKCS12
#这里先放一个参数,一会儿再程序中直接@Value获取
myhttp.port=9097
# 此端口为HTTPS端口
server.port=9095
import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class RestaurantApplication {public static void main(String[] args) {try {SpringApplication.run(RestaurantApplication.class, args);} catch (Exception e) {e.printStackTrace();}}@Value("${myhttp.port}")private Integer httpPort;//SpringBoot 2.x版本(以及更高版本) 使用下面的代码@Beanpublic ServletWebServerFactory servletContainer() {TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();tomcat.addAdditionalTomcatConnectors(createHTTPConnector());return tomcat;}private Connector createHTTPConnector() {Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");connector.setScheme("http");connector.setSecure(false);connector.setPort(httpPort);return connector;}/*** 创建wss协议接口** @return*/@Beanpublic TomcatContextCustomizer tomcatContextCustomizer() {System.out.println("websocket init");return new TomcatContextCustomizer() {@Overridepublic void customize(Context context) {System.out.println("init   customize");context.addServletContainerInitializer(new WsSci(), null);}};}

然后在启动项目。

到这里所有的配置都已经结束了,接下来就是测试了。

附上测试代码:我这里就不再说明了。

websocket pom依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.soonreach.oas.util.httpUtil;
import com.soonreach.oas.vo.messageVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;/*** WebSocketServer** @author lihao*/
@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class WebSocketServer {//private RedisTemplate redisTemplate =new RedisTemplate();/*** 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/private static int onlineCount = 0;/*** concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。*/private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();/*** 与某个客户端的连接会话,需要通过它来给客户端发送数据*/private Session session;/*** 接收userId*/private String userId = "";/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("userId") String userId) {this.session = session;this.userId = userId;if (webSocketMap.containsKey(userId)) {webSocketMap.remove(userId);webSocketMap.put(userId, this);//加入set中} else {webSocketMap.put(userId, this);//加入set中addOnlineCount();//在线数加1}log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount());}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {if (webSocketMap.containsKey(userId)) {webSocketMap.remove(userId);//从set中删除subOnlineCount();}log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount());}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) throws IOException {log.info("用户消息:" + userId + ",报文:" + message);//可以群发消息//消息保存到数据库、redis}/*** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("用户错误:" + this.userId + ",原因:" + error.getMessage());error.printStackTrace();}/*** 实现服务器主动推送*/public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}/*** 发送自定义消息*/public static void sendInfo(String message, @PathParam("userId") String userId) throws IOException {log.info("发送消息到:" + userId + ",报文:" + message);log.error("用户" + userId + ",不在线!");}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {com.soonreach.oas.config.WebSocketServer.onlineCount++;}public static synchronized void subOnlineCount() {com.soonreach.oas.config.WebSocketServer.onlineCount--;}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** 开启WebSocket支持** @author lihao*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>websocket通讯</title>
</head>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>var socket;function openSocket() {if (typeof (WebSocket) == "undefined") {console.log("您的浏览器不支持WebSocket");} else {console.log("您的浏览器支持WebSocket");//实现化WebSocket对象,指定要连接的服务器地址与端口  建立连接//等同于socket = new WebSocket("ws://localhost:8888/xxxx/im/25");//var socketUrl="${request.contextPath}/im/"+$("#userId").val();var socketUrl = "https://localhost:9093/websocket/" + $("#userId").val();socketUrl = socketUrl.replace("https", "wss").replace("http", "ws");console.log(socketUrl);if (socket != null) {socket.close();socket = null;}socket = new WebSocket(socketUrl);//打开事件socket.onopen = function () {console.log("websocket已打开");//socket.send("这是来自客户端的消息" + location.href + new Date());};//获得消息事件socket.onmessage = function (msg) {console.log(msg.data);//发现消息进入    开始处理前端触发逻辑};//关闭事件socket.onclose = function () {console.log("websocket已关闭");};//发生了错误事件socket.onerror = function () {console.log("websocket发生了错误");}}}function sendMessage() {if (typeof (WebSocket) == "undefined") {console.log("您的浏览器不支持WebSocket");} else {console.log("您的浏览器支持WebSocket");console.log($("#contentText").val());socket.send($("#contentText").val());}}
</script>
<body>
<p>【userId】:
<div><input id="userId" name="userId" type="text" value="10"></div>
<p>【toUserId】:
<div><input id="toUserId" name="toUserId" type="text" value="20"></div>
<p>【toUserId】:
<div><input id="contentText" name="contentText" type="text" value="hello websocket"></div>
<p>【操作】:
<div><a onclick="openSocket()">开启socket</a></div>
<p>【操作】:
<div><a onclick="sendMessage()">发送消息</a></div>
</body></html>

springboot整合https和wss协议相关推荐

  1. Lnmp Swoole使用wss协议

    image.png 准备工作 申请 SSL 证书,传送 阿里云免费SSL证书申请: 首先安装 swoole 扩展,传送 Lnmp Swoole扩展安装. 开启SSL支持 安装openssl $ apt ...

  2. Https双向验证与Springboot整合测试-人来人往我只认你

    1 简介 不知不觉Https相关的文章已经写了6篇了,本文将是这个专题的最后一篇,起码近期是最后一篇.前面6篇讲的全都是单向的Https验证,本文将重点介绍一下双向验证.有兴趣的同学可以了解一下之前的 ...

  3. SpringBoot 整合WebSocket 简单实战案例

    前言 这个简单实战案例主要目的是让大家了解websocket的一些简单使用. 另外使用stomp方式的: <Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 ...

  4. Websocket实现wss协议连接支持语音聊天功能

    部署单页应用 SPA 时,我们通常使用 Nginx 做中间层进行转发代理.为了保护 Web 安全,要求我们使用 HTTPS(HTTP + SSL) 以及 WSS(Websocket + SSL) 进行 ...

  5. 先码后看 如何搭建小程序https和wss服务器 侵立删

    转自:https://blog.csdn.net/w2456/article/details/53943080 年底了写一篇小程序环境搭建的文章, 主要是怎么搭建一个线上环境以及怎么不改动原有http ...

  6. 搭建微信小程序基本的https与wss环境

    搭建微信小主要是怎么搭建一个线上环境以及怎么不改动原有http Api的情况 1.准备工作 域名一个 SSL证书(推荐: https://gworg.taobao.com) Centos服务器一台 n ...

  7. nginx实现对websocket加密协议wss协议的反向代理以及websocket整合springboot入门(踩坑)

    出发点 最近公司需要有一个推送前端消息的需求 首选websocket进行推送,也做过客服系统接触过,最近看了一点websocket的相关内容记录总结一下. 什么是websocket websocket ...

  8. Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程

    前言 如果你还没有了解过websocket,关于整合websocket的简单入门使用,可以先看看我这篇: <SpringBoot 整合WebSocket 简单实战案例> https://b ...

  9. Springboot 整合 WebSocket ,使用STOMP协议+Redis 解决负载场景问题(二)

    前言 上一篇,简单给大家整合了一下websocket,使用stomp方式. 这篇,就是考虑到单体的服务使用websocket ,按照上一篇的整合,确实没问题. 但是如果一旦是负载多台服务的时候,那么就 ...

最新文章

  1. 烂泥:为KVM虚拟机添加网卡
  2. 在ne中分析贱谈.net中简体转繁体
  3. Python检查字符串重叠部分并进行拼接
  4. NAT负载均衡_ftp
  5. Windows原版系统下载地址列表
  6. 上海康桥先进制造技术创业园项目远程预付费系统的应用-安科瑞耿敏花
  7. HIVE 系列 (4) hive 内部表和外部表HQL查询统计
  8. 手机发布新闻php,自动发布新闻的php代码_php
  9. Google Dremel架构
  10. Ceph性能测试(RBD、CephFS、NFS、Cache Tier)
  11. TypeError: e[h] is not a function
  12. indexOf() 与 jquery.inArray()
  13. 金山网盾3.6beta2新增下载安全防御 增强全面诊断
  14. 偷偷自动拷贝U盘文件(按照原文件夹格式保存)实用
  15. 台式华硕计算机型号规格,华硕笔记本电脑有哪些型号 华硕笔记本电脑型号大全...
  16. android调用系统相机实现拍照功能
  17. Android CMake 编译传递宏定义参数
  18. Qt Creator fcitx5 中文输入法失效的问题
  19. 零基础根据Mars3D开发教程发布三维数据
  20. 【Azure】微软 Azure 基础解析(八)Azure 存储服务:探索Blob存储、队列存储、文件存储的特性与适用场景

热门文章

  1. 浏览器与解释器【转】
  2. python停车场_python 多线程同步锁之实现停车场业务 (1)
  3. 基于Bootstrap3制作响应式布局网站(一)
  4. 服务器电源维修成都,成都电力电源维修
  5. C#中的static,interface,virtual,abstract,override的用法
  6. 天河一号 中国最快的计算机
  7. 鸿蒙系统当贝市场,新款华为智慧屏如何安装第三方软件?当贝市场分享最详细的安装教程详解...
  8. php贴吧源码,FluxBB v1.5.11 php论坛贴吧源码下载
  9. 大数据上机基础—HDFS文件操作
  10. USBCAN在江淮新能源汽车诊断工具的应用案例