第一步:
首先得明白什么是wss協(xié)議:
可以看這篇文章:WSS、SSL 和 https 之間的關(guān)系
第二步:
先拿到ssl證書:我這邊是用的阿里云的免費證書具體獲取方法如下:
先登錄阿里云官網(wǎng)找到SSL證書選項,然后申請免費證書,然后下載tomcat證書。
可以參考:阿里云申請免費 SSL證書 https 的圖文教程_林中明月間丶-CSDN博客_阿里云申請免費ssl證書
將下載的證書壓縮包解壓,找到后綴為.pfx的證書文件導(dǎo)入我們的springboot項目,如圖:
然后在springboot的配置文件里面配置相應(yīng)的屬性(證書密碼在解壓后的pfx-password.txt文件中可以查看),我這邊是配置了兩個端口http和https都能訪問該項目,同理ws和wss協(xié)議也都是支持的。
server.ssl.key-store=classpath:證書名稱.pfx
# 密碼
server.ssl.key-store-password=證書密碼
# 秘鑰證書庫類型
server.ssl.keyStoreType=PKCS12
#這里先放一個參數(shù),一會兒再程序中直接@Value獲取
myhttp.port=9097
# 此端口為HTTPS端口
server.port=9095
在這里插入代碼片
添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
import com.wanma.display.center.ds.DynamicDataSourceRegister;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.websocket.server.WsSci;
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.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@Import(DynamicDataSourceRegister.class)
@EnableScheduling
public class DisplayCenterApplication {
public static void main(String[] args) {
SpringApplication.run(DisplayCenterApplication.class, args);
}
@Value("${myhttp.port}")
private Integer httpPort;
@Bean
public 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;
}
/**
* 創(chuàng)建wss協(xié)議接口
*
* @return
*/
@Bean
public TomcatContextCustomizer tomcatContextCustomizer() {
System.out.println("websocket init");
return new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
System.out.println("init customize");
context.addServletContainerInitializer(new WsSci(), null);
}
};
}
}
添加WebSocketConfig 配置類
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
然后在啟動項目。
到這里所有的配置都已經(jīng)結(jié)束了,接下來就是測試了。文章來源:http://www.zghlxwxcb.cn/news/detail-506207.html
websocket 代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-506207.html
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint("/ws/{token}") // 指定建立連接使用的URI
@Component
public class WebSocketServer {
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
/**
* 用于存儲Session的Map,key為連接標(biāo)識
*/
public static final Map<String, Session> SESSION_MAP = new ConcurrentHashMap<>();
/**
* 連接建立
* 從請求的URL:ws://localhost:8091/ws/{token}參數(shù)里面獲取標(biāo)識token
*/
@OnOpen
public void onOpen(@PathParam("token") String token, Session session){
LOGGER.info("長連接已建立,用戶:" + token);
System.out.println("長連接已建立,用戶:" + token);
// 存儲連接session,在需要用的地方直接使用
SESSION_MAP.put(token,session);
}
// /**
// * 收消息
// */
// @OnMessage
// public void onMessage(){
// }
/**
* 連接斷開
* @param token
* @param session
*/
@OnClose
public void onClose(@PathParam("token") String token, Session session){
LOGGER.info("長連接已斷開,用戶:" + token);
System.out.println("長連接已斷開,用戶:" + token);
SESSION_MAP.remove(token);
}
/**
* 長連接出現(xiàn)異常
*/
@OnError
public void onError(Throwable throwable){
LOGGER.info("長連接出現(xiàn)異常:" + throwable.getMessage());
System.out.println("長連接出現(xiàn)異常:" + throwable.getMessage());
}
}
<!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");
//實現(xiàn)化WebSocket對象,指定要連接的服務(wù)器地址與端口 建立連接
//等同于socket = new WebSocket("ws://localhost:8888/xxxx/im/25");
//var socketUrl="${request.contextPath}/im/"+$("#userId").val();
//var socketUrl="http://app.boruisijj.com:9099/demo/imserver/"+$("#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);
//發(fā)現(xiàn)消息進入 開始處理前端觸發(fā)邏輯
};
//關(guān)閉事件
socket.onclose = function () {
console.log("websocket已關(guān)閉");
};
//發(fā)生了錯誤事件
socket.onerror = function () {
console.log("websocket發(fā)生了錯誤");
}
}
}
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 οnclick="openSocket()">開啟socket</a></div>
<p>【操作】:
<div><a οnclick="sendMessage()">發(fā)送消息</a></div>
</body>
</html>
到了這里,關(guān)于SpringBoot配置https(SSL證書)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!