教你如何使用SpringBoot+Websocket+xterm+jsch實現一個網頁版的Xshell

1、前言

  上個週末的時候,在方誌朋老師的公衆號上看見了一篇《教你用純Java實現一個網頁版的Xshell(附源碼)》的文章,非常感興趣,這不正好這週六稍有閒時,就好好的研究了研究,順便記錄一下學習心得。
  github項目開源地址:https://github.com/NoCortY/WebSSH,感興趣的童鞋們,可以自己運行該項目,需要注意的是:首先,環境需要運行在一個可以使用Xshell的環境中,不然沒有辦法測試,其次,在運行該項目時,需要修改連接到服務的地址、用戶名密碼等,在webssh.html文件中進行修改。

2、技術選型

  最終的技術選型就是: SpringBoot+Websocket+jsch+xterm.js。

  在方誌朋老師的文章中,已經分析了爲什麼做這種技術選型,這裏分別在把用到的這幾種技術,在詳細的記錄一下,畢竟有些東西在實際工作中,用的不是太多。

SpringBoot

  首先就是SpringBoot框架,這個就不展開說了,基本上是現在構建JavaWeb項目的首選了。畢竟使用SpringBoot可以很大程度的提高環境搭建的效率,也有助於Spring生態圈中一些框架的集成應用。

Websocket

  由於webssh需要實時數據交互,所以會選用長連接的WebSocket。

  WebSocket協議是基於TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發送信息給客戶端。HTTP 協議有一個缺陷:通信只能由客戶端發起,HTTP 協議做不到服務器主動向客戶端推送信息,所以WebSocket就是爲了彌補HTTP協議的這種缺陷,而產生的。

  在SpringBoot中配置Websocket的方式有兩種:一種是通過@ServerEndpoint註解進行配置,一種是通過繼承WebSocketConfigurer配置文件來實現(有多種形式)。在這篇內容中就是通過第二種,繼承WebSocketConfigurer類,然後把處理器(Handler)和攔截器(Interceptor)註冊到WebSocket的Java配置類中,這裏不再展開,後續專門學習相關內容。

JSCH

  JSCH是Java Secure Channel的縮寫。JSCH是一個SSH2的純Java實現。它允許你連接到一個SSH服務器,並且可以使用端口轉發,X11轉發,文件傳輸等,當然你也可以集成它的功能到你自己的應用程序,即JSCH是這篇文章中實現SSH通信的核心API。

  JSCH的API地址:http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/package-summary.html

  在這篇內容中主要應用到了一下幾個類:

  • JSch 核心配置類作用,同時也作爲創建會話(Session)的工廠類
  • Session 通信的會話。主要提供了一些配置會話參數、連接SSH服務,打開Channel通道等方法。
  • Channel 通道,用於Shell命令的執行,包括的子類有ChannelExec, ChannelShell, ChannelSubsystem等。
  • ChannelSftp 文件通道,相關的類還有 SftpATTRS 、SftpProgressMonitor等。
  • UserInfo、UIKeyboardInteractive 用戶信息接口,用於保存和獲取在Session中的用戶信息。
xterm

  xterm 是一個使用 TypeScript 編寫的前端終端組件,可以直接在瀏覽器中實現一個命令行終端應用。
在這裏插入圖片描述
主要特性:

  • 終端應用程序正常工作:Xterm.js適用於大多數終端應用程序,如bash,vim和tmux,這包括對基於curses的應用程序和鼠標事件支持的支持
  • Performant:Xterm.js 非常快,它甚至還包括一個GPU加速的渲染器
  • 豐富的 unicode 支持:支持CJK,表情符號和IME
  • 自包含:零依賴性
  • 可訪問:可以使用screenReaderMode選項打開屏幕閱讀器支持
  • 還有更多:鏈接,主題,插件,記錄良好的API等。

具體用戶可以參考官方文檔:《xtermjs文檔》

3、源碼解讀

  在方誌朋老師的文章中,整個後臺代碼的邏輯講解的已經比較詳細了,我這裏按照自己學習源碼的思路把所有的類,彙總一下,方便後期再次代碼的基礎上,在擴展其他新的功能和用法。

  • WebSSHStarter
      首先是SpringBoot的啓動類WebSSHStarter,最簡單的啓動類。對應的應用參數,在config/application.yml配置文件中進行了配置。

  • WebSSHWebSocketConfig
      SpringBoot配置WebSocket的類,前面提到過,這裏使用了繼承WebSocketConfigurer類的方法進行了實現。在這個配置類中,把處理器(Handler)和攔截器(Interceptor)都註冊到了WebSocket的註冊器中了。

  • WebSocketInterceptor
      在方誌朋老師提供的實例中,這個攔截器的意義不太大,只是攔截了request請求,並隨機生成了一個UUID作爲用戶標識,傳到了後續的邏輯中,在實際生成環境中,這裏可以實現用戶認證的代碼邏輯。

  • WebSSHWebSocketHandler
      該處理器類實現了WebSocketHandler接口,主要用來完成Websocket消息和WebSocket生命週期中事件的處理,即這個類是WebSocket事件回調方法的入口。其實,在這類中,方誌朋老師是通過調用WebSSHService接口的具體實現類來實現了具體的業務邏輯,所以在於SSH服務進行通信的核心代碼是在WebSSHService接口的實現類中進行的。

  • WebSSHService接口、WebSSHServiceImpl實現類
      在WebSSHService接口中定義了四個方法,分別是:初始化、處理請求、回寫響應數據、關閉連接。
      其中,在初始化方法中,主要實現了JSch對象的初始化,包括當前用戶的信息的維護;處理請求方法中,主要處理兩類請求,一類是連接操作請求,一類是命令操作請求,在該方法中用到了線程池ExecutorService的概念;回寫響應數據方法,這裏通過在進行連接操作的時候,就創建了一個線程,一直在監聽是否有需要回寫的數據,如果有的話,就直接通過org.springframework.web.socket.WebSocketSession的sendMessage()方法回寫到客戶端;關閉連接,主要是在連接斷開後,會清理釋放被佔用的資源。

  • POJO類、常量類
      基礎類。

  • RouterController類
      提供的進入控制檯界面的入口類,對用的界面是webssh.html。

  • 前端實現
      在static文件夾下是前端頁面的實現,需要注意:在運行該項目時,需要修改連接到服務的地址、用戶名密碼等,在webssh.html文件中進行修改。

4、結尾

  在方誌朋老師的文章中,講解的已經比較詳細了,這裏主要是針對在學習這篇文章中的記錄的一些筆記,後續會在這個項目的基礎上進行進一步的開發,大致的方向是:

  1. 連接服務的用戶密碼,可以讓用戶可以配置
  2. 提供可以連接多個服務的方式,即同時創建多個會話,類似xShell的選項卡。
  3. 提供附件處理的功能,在這個實例中,沒有實現相關內容。

  新項目的地址在:https://gitee.com/hsh2015/webshh.git。該項目還在持續開發中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章