引入javax.websocket.api得到運用websocket,爲什麼要Springboot要整合websocket?在websocket運行於外部Tomcat時,當一對servlet訪問,就產生了一個websocket實例,兩兩相對通訊,一個客戶端一個服務端。經過這個發現,導致後面的代碼要改,比如容器不能在這裏面要麼是靜態!因爲這是產生多例
在運行於外部Tomcat,一個訪問一個實例服務,運行在Springboot內嵌Tomcat則不是這樣了,訪問不上,因爲註冊不進去。指的不上注入到Spring容器中,而是websocket服務註冊不進去通過以前的方法。實例對象註解能注入,到websocket服務註冊不到Tomcat容器中。就訪問不上了,所以有整合一說,使用Springboot按約定進行整合開發。因爲有依賴所以要整合,websocket依賴於web容器,而Springboot自己嵌容器,所以要進去就只有整合。如果無依賴Spring則注入與否都一樣
jsp代碼和之前的一樣,通過url長時間連接服務器,進行通訊。頁面代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script>
var websocket;
if ('WebSocket' in window) {
websocket = new WebSocket("ws://localhost:8080/websocket/zhangsan");
} else {
console.log("不支持websocket");
}
window.onbeforeunload = function (ev) {
console.log("準備關閉連接")
websocket.close();
}
websocket.onmessage = function (ev) {
console.log("收到服務器消息: " + ev.data)
}
websocket.onerror = function (ev) {
console.log("出現異常")
}
websocket.onopen = function (ev) {
console.log("連接建立成功")
}
</script>
</head>
<body>
<input type="text" name="">
<button id="clickEndpoint">發送消息</button>
</body>
<script>
var v = document.getElementById("clickEndpoint");
v.onclick = function (msg) {
websocket.send("xixihaha");
}
</script>
</html>
判斷是否支持websocket,加載script時通過ws://url連接服務器,給window註冊時間,點擊按鈕websocket對象.send發出信息
服務端:
@Configuration表示自己是個配置類,@EnableWebSocket將websocket的bean都管理進來。實現與websocketConfigurer接口。將重寫方法registerWebSocketHandler是:註冊websocket處理者。前面是處理者類,後面是websocket的服務名。
給註冊處理類添加攔截器,這樣將在進行websocket經過攔截器,當然攔截器可要可不要。如果有需求到可要要,我們這裏爲了拿到一點信息使用了攔截器
攔截器:
實現攔截器接口,將重寫2方法,攔截前與攔截後方法,。從請求頭獲得url,得到/zhangsan,截取掉/,拿到參數的map,將截取的名字放進去,後面可要拿到這個map在websocket處理類中攔截器返回true表示繼續往下調用,否則將原地停止
實現處理類,裏面的方法與websocket類似,建立連接,存儲在容器中。接收到消息調用Message方法,並得到websocketsession對象發送消息。這裏是自己給自己發,也不打算去找誰去發送
發送異常以連接管理。都在重寫方法內
通訊成功
使用websocket連接是建立了,但用戶一刷新又是新連接這樣也不合適,於是給用戶打標識。關於如何調用到註解下的方法,工程收到別人的管理,他得到類的構造掃描類下的所有註解,符合就調用。如果他想在類的前與後做操作就產生代理。這兩點做法是不一樣的。一個是構造得到類的註解調用這些方法,一個是給類代理在類調用前後觸發inkove不知不覺進行前與後操作
關於攔截器與過濾器,過濾器是符合過濾要求進入過濾器,可以選擇往下調用,當掉完在回調到方法調用處。而攔截器是給類產生代理。在類的前後前後調用操作,調不調用你要掉的方法是隨便