


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