摘 ?要:隨著互聯(lián)網(wǎng)的全面普及,手機(jī)、電腦等海量智能終端不斷接入網(wǎng)絡(luò),在公網(wǎng)資源有限的情況下,絕大部分終端設(shè)備均運(yùn)行于內(nèi)網(wǎng),外網(wǎng)一般無法直接訪問內(nèi)網(wǎng)數(shù)據(jù)。本文針對WebSocket技術(shù)的特征,設(shè)計(jì)并實(shí)現(xiàn)了一種基于WebSocket的內(nèi)外網(wǎng)數(shù)據(jù)交互系統(tǒng),系統(tǒng)通過WebSocket建立內(nèi)外網(wǎng)數(shù)據(jù)通道,實(shí)現(xiàn)了數(shù)據(jù)交互共享,為內(nèi)外網(wǎng)數(shù)據(jù)交互應(yīng)用場景提供了一種有效地解決方案。
關(guān)鍵詞:WebSocket;內(nèi)外網(wǎng)數(shù)據(jù)交互;SpringBoot
中圖分類號:TP311 ? ? 文獻(xiàn)標(biāo)識碼:A
Abstract: With the popularity of the Internet, massive smart terminals such as mobile phones and computers have a constant access to the network. However, in the case of limited public network resources, a large majority of terminal devices are operated on the Intranet, the data of which cannot be directly accessible from the Extranet. This paper designs and implements a WebSocket-based internal and external network data interaction system that realizes data interaction sharing by establishing internal and external network data channels through WebSocket. This system provides an effective solution to data exchange application scenarios in Intranet and Extranet.
Keywords: WebSocket; intranet data exchange; SpringBoot
1 ? 引言(Introduction)
隨著移動通信技術(shù)的迅速發(fā)展,互聯(lián)網(wǎng)基本實(shí)現(xiàn)了全面普及,手機(jī)、電腦等海量智能終端均已接入了網(wǎng)絡(luò)。在公網(wǎng)資源有限的情況下,絕大部分終端設(shè)備均運(yùn)行于內(nèi)網(wǎng),外網(wǎng)一般無法直接訪問內(nèi)網(wǎng)數(shù)據(jù),因此在保證安全的前提下做到外網(wǎng)下的應(yīng)用與內(nèi)網(wǎng)環(huán)境下的業(yè)務(wù)數(shù)據(jù)進(jìn)行交互[1],實(shí)現(xiàn)內(nèi)外網(wǎng)數(shù)據(jù)交互信息共享顯得尤為重要。
內(nèi)網(wǎng)通常指局域網(wǎng),外網(wǎng)是相對內(nèi)網(wǎng)而言,是面向Internet部署的網(wǎng)絡(luò)[2]。傳統(tǒng)的內(nèi)外網(wǎng)數(shù)據(jù)交互方案主要有NAT映射和安裝反向代理軟件,實(shí)現(xiàn)NAT映射需要網(wǎng)絡(luò)管理員介入進(jìn)行手工配置,在內(nèi)網(wǎng)設(shè)備動態(tài)接入、數(shù)量多的情況下實(shí)施起來非常困難。安裝反向代理軟件雖然簡便快捷,但第三方軟件的介入存在數(shù)據(jù)安全隱患。基于WebSocket的內(nèi)外網(wǎng)數(shù)據(jù)交互系統(tǒng)充分利用了WebSocket技術(shù)安全、高效、全雙工通信的特征,提供了一種易于部署和管理的內(nèi)外網(wǎng)數(shù)據(jù)交互方案。
2 ?WebSocket技術(shù)特征(WebSocket technical features)
WebSocket協(xié)議是HTML5中提出的一種基TCP的新通信協(xié)議[3],其工作過程為通過一次“握手”建立一條長連接,實(shí)現(xiàn)了瀏覽器端與服務(wù)器端之間的全雙工(full-duplex)通信[4]。在基于WebSocket的通訊過程中,服務(wù)器端與客戶端完全對等,雙方可以主動互發(fā)消息,解決了HTTP協(xié)議下服務(wù)器端不能主動發(fā)消息給客戶端的問題,真正實(shí)現(xiàn)了二者之間快速、高效、全雙工數(shù)據(jù)交互。WebSocket建立連接及通信過程如圖1所示。
WebSocket作為HTML5的標(biāo)準(zhǔn)通信協(xié)議,廣泛應(yīng)用于B/S架構(gòu)的應(yīng)用中,其在建立連接之初使用HTTP協(xié)議發(fā)起“握手”請求,客戶端與服務(wù)器端“握手”完成后便可以建立一條高效、持久、實(shí)時(shí)的雙向數(shù)據(jù)通道,除非客戶端或服務(wù)器端主動斷開,這條數(shù)據(jù)通道會以長連接形式持久保持,實(shí)現(xiàn)生產(chǎn)數(shù)據(jù)實(shí)時(shí)推送,有效降低了網(wǎng)絡(luò)吞吐量,提高了通信效率[5]。
在安全性方面,WebSocket協(xié)議提供了兩種URI方案供用戶選擇,其中前綴為WS的URI為未加密的一般連接,前綴為WSS的URI為加密的高安全性連接。其中“WSS”連接基于安全傳輸層協(xié)議(Transport Layer Security Protocol,TLSP)確保WebSocket連接的保密性和數(shù)據(jù)完整性[6]。
3 ? 系統(tǒng)設(shè)計(jì)(System design)
3.1 ? 系統(tǒng)總體架構(gòu)設(shè)計(jì)
為便捷的實(shí)現(xiàn)內(nèi)外網(wǎng)數(shù)據(jù)交互共享,系統(tǒng)采用B/S模式,在總體架構(gòu)上分為外網(wǎng)服務(wù)管理端、內(nèi)網(wǎng)數(shù)據(jù)服務(wù)端和通用數(shù)據(jù)調(diào)用客戶端三個部分。充分利用外網(wǎng)WebSocket服務(wù)作為“橋梁”打通調(diào)用客戶端與內(nèi)網(wǎng)客戶端的數(shù)據(jù)通道,從而 “穿透”內(nèi)網(wǎng)數(shù)據(jù)的訪問,最終實(shí)現(xiàn)數(shù)據(jù)交互和共享。系統(tǒng)體系結(jié)構(gòu)圖如圖2所示。
3.2 ? 系統(tǒng)功能設(shè)計(jì)
系統(tǒng)在功能上劃分為外網(wǎng)WebSocket服務(wù)管理子系統(tǒng)和內(nèi)網(wǎng)數(shù)據(jù)服務(wù)子系統(tǒng),外網(wǎng)WebSocket服務(wù)管理子系統(tǒng)提供系統(tǒng)的核心服務(wù),實(shí)現(xiàn)了內(nèi)外網(wǎng)數(shù)據(jù)“橋梁”并提供統(tǒng)一Web服務(wù);內(nèi)網(wǎng)數(shù)據(jù)服務(wù)子系統(tǒng)整合了內(nèi)網(wǎng)WebSocket客戶端和內(nèi)網(wǎng)Web服務(wù),提供內(nèi)網(wǎng)統(tǒng)一數(shù)據(jù)傳輸業(yè)務(wù)接口。系統(tǒng)功能結(jié)構(gòu)圖如圖3所示。
系統(tǒng)主要功能模塊如下:
(1)用戶管理模塊。實(shí)現(xiàn)用戶信息、用戶角色和訪問權(quán)限的管理功能,通過用戶鑒權(quán)方可接入系統(tǒng)。
(2)連接監(jiān)控模塊。實(shí)現(xiàn)對已接入系統(tǒng)進(jìn)行數(shù)據(jù)交互的WebSocket連接進(jìn)行動態(tài)監(jiān)控和管理。
(3)安全控制模塊。實(shí)現(xiàn)對調(diào)用客戶端的IP、訪問頻次等限制性規(guī)則的管理。
(4)系統(tǒng)日志模塊。記錄系統(tǒng)用戶訪問、操作、數(shù)據(jù)連接與傳輸?shù)雀鞣N吸入事件記錄。
(5)數(shù)據(jù)傳輸監(jiān)控模塊。實(shí)現(xiàn)對系統(tǒng)中所有數(shù)據(jù)傳輸類型、數(shù)據(jù)大小等信息進(jìn)行監(jiān)控。
(6)數(shù)據(jù)源管理模塊。實(shí)現(xiàn)對內(nèi)網(wǎng)可訪問數(shù)據(jù)源的配置和設(shè)置,未經(jīng)配置的數(shù)據(jù)源用戶無法進(jìn)行訪問。
(7)連接配置模塊。實(shí)現(xiàn)與外網(wǎng)WebSocket服務(wù)管理子系統(tǒng)的對接的服務(wù)地址、登錄信息等配置。
(8)數(shù)據(jù)日志模塊。實(shí)現(xiàn)內(nèi)網(wǎng)數(shù)據(jù)傳輸日志記錄和管理。
4 ? 系統(tǒng)實(shí)現(xiàn)(System implementation)
4.1 ? 系統(tǒng)技術(shù)選型
系統(tǒng)采用SpringBoot框架進(jìn)行實(shí)現(xiàn),通過SpringBoot整合Web服務(wù)和WebSocket服務(wù)。SpringBoot是目前業(yè)界最為流行的Java EE一站式解決方案,具有快速構(gòu)建、自動配置等特點(diǎn),使Spring更加易于開發(fā)和維護(hù)[7]。
SpringBoot對WebSocket服務(wù)端提供了良好的支持,只需要在Maven配置文件中加入WebSocket依賴即可,開發(fā)者在實(shí)現(xiàn)過程中只需關(guān)注業(yè)務(wù)需求的實(shí)現(xiàn),可有效降低系統(tǒng)實(shí)現(xiàn)難度和提升開發(fā)效率。
4.2 ? 系統(tǒng)鑒權(quán)的實(shí)現(xiàn)
為更好的保障數(shù)據(jù)安全,系統(tǒng)采用Token機(jī)制來實(shí)現(xiàn)WebSoket連接安全認(rèn)證,即用戶在登錄成功后會得到一個Token,每次建立WebSocket連接必須在首次握手中對Token進(jìn)行驗(yàn)證,無Token或無效Token將導(dǎo)致服務(wù)端直接斷開,以此來保證系統(tǒng)的安全性。系統(tǒng)鑒權(quán)流程如圖4所示。
4.3 ? 外網(wǎng)子系統(tǒng)核心功能實(shí)現(xiàn)
外網(wǎng)子系統(tǒng)的核心功能為WebSocket的連接、管理和數(shù)據(jù)收發(fā)。系統(tǒng)過添加spring-boot-starter-websocket依賴來獲得WebSocket服務(wù)端的支持,通過Configuration注解輕松實(shí)現(xiàn)配置。利用ServerEndpoint注解可以輕松實(shí)現(xiàn)WebScoketServer類。用戶首先通過Web登錄并獲得授權(quán)Token,然后只需通過路徑參數(shù)中攜帶的用戶ID即可通過WebSocketServer輕松與該ID的客戶端進(jìn)行通信。WebSocketServer類主要實(shí)現(xiàn)代碼如下:
@ServerEndpoint("/websocket/{userId}")
@Component
public class WebSocketServer {
//存放每個客戶端對應(yīng)的WebSocketServer對象
private static CopyOnWriteArraySet
//建立連接時(shí)驗(yàn)證Token
@OnOpen
public void onOpen(Session session,@PathParam("userId") String sid) {
if(verifyToken(session)){ //成功建立連接}
}
//接受數(shù)據(jù)并轉(zhuǎn)發(fā)給指定客戶端
@OnMessage
public void onMessage(String message, Session session) {
//根據(jù)用 戶ID進(jìn)行收發(fā)數(shù)據(jù)
}
為實(shí)現(xiàn)對用戶連接的監(jiān)控,可以通過管理連接對象、Session或Token的方式進(jìn)行實(shí)現(xiàn)連接的手動管理,另外在onMessage及sendMessage方法中對數(shù)據(jù)進(jìn)行分析和記錄。
4.4 ? 內(nèi)網(wǎng)子系統(tǒng)核心功能實(shí)現(xiàn)
內(nèi)網(wǎng)子系統(tǒng)的核心功能為與外網(wǎng)建立WebSocket連接和提供數(shù)據(jù)交互業(yè)務(wù)接口。與服務(wù)器端建立WebSocket連接一般用于前端網(wǎng)頁,本系統(tǒng)為更好的實(shí)現(xiàn)對內(nèi)網(wǎng)所有本地、設(shè)備等信息進(jìn)行讀取,采用Java WebSocket實(shí)現(xiàn)的WebSocket客戶端,需要在項(xiàng)目的Maven配置中添加org.java-websocket依賴,只需通過繼承WebSocketClient類實(shí)現(xiàn)一個WebSocket客戶端,其主要方法代碼如下:
public class DataTransWebSocketClient extends WebSocketClient{
//首次握手回調(diào)
public void onOpen(ServerHandshake arg0) {//握手處理}
//收到并處理數(shù)據(jù)
public void onMessage(String message) {//處理收到數(shù)據(jù)}
//發(fā)送數(shù)據(jù)到WebSocket服務(wù)器
public void send(String data) {//發(fā)送數(shù)據(jù)}
}
數(shù)據(jù)交互業(yè)務(wù)接口采用SpringBoot Web技術(shù)和Spring Data JPA技術(shù)進(jìn)行構(gòu)建和實(shí)現(xiàn)。
5 ? 結(jié)論(Conclusion)
隨著互聯(lián)網(wǎng)的全面普及,信息共享變得無處不在,在保證安全的前提下進(jìn)行內(nèi)外網(wǎng)數(shù)據(jù)交互共享有著廣泛的應(yīng)用場景。本文通過對WebSocket技術(shù)特征進(jìn)行分析,設(shè)計(jì)了一種兼具安全性、拓展性和靈活性的內(nèi)外網(wǎng)數(shù)據(jù)交互系統(tǒng),采用成熟的Java EE技術(shù)加以實(shí)現(xiàn)。系統(tǒng)以公網(wǎng)WebSocket服務(wù)為橋梁,使用登錄和Token機(jī)制進(jìn)行鑒權(quán),內(nèi)網(wǎng)通過配置便可與外網(wǎng)服務(wù)連接進(jìn)行數(shù)據(jù)雙向交互共享,有效降低了內(nèi)外網(wǎng)數(shù)據(jù)交互的使用難度和部署成本,同時(shí)保障了系統(tǒng)的數(shù)據(jù)安全。
參考文獻(xiàn)(References)
[1] 孟威,喬林,劉穎,等.基于電力企業(yè)移動辦公的內(nèi)外網(wǎng)數(shù)據(jù)交互[J].計(jì)算機(jī)科學(xué)與探索,2017(11):480-482.
[2] 何鈺,李瑞祥.實(shí)現(xiàn)內(nèi)外網(wǎng)數(shù)據(jù)交互安全[J].網(wǎng)絡(luò)安全和信息化,2017(9):127-129.
[3] 萬可達(dá).基WebSocket的水泥廠動設(shè)備的全平臺狀態(tài)監(jiān)測系統(tǒng)的研究[D].杭州:浙江大學(xué),2018.
[4] 潘峰,王笑天.基于Redis與WebSocket的戰(zhàn)場態(tài)勢實(shí)時(shí)推送方案設(shè)計(jì)及實(shí)現(xiàn)[J].軟件導(dǎo)刊,2018(7):143-146.
[5] 曹文彬,譚新明,劉備,等.基于事件驅(qū)動的高性能WebSocket服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2018(1):20-27.
[6] 劉棟,黃斌,王鋒,等.WebSocket技術(shù)在信息安全系統(tǒng)中的應(yīng)用實(shí)現(xiàn)[J].信息安全與通信保密,2016(5):92-94.
[7] 張峰.應(yīng)用SpringBoot改變Web應(yīng)用開發(fā)模式[J].科技創(chuàng)新與應(yīng)用,2017(23):30-31.
作者簡介:
吳英賓(1983-),男,碩士,講師.研究領(lǐng)域:軟件開發(fā).