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