日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

guacamole 纯web rdp预研:web应用程序部分

發布時間:2024/1/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 guacamole 纯web rdp预研:web应用程序部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • web rdp預研 web應用程序部分
    • 預研目的
    • 相關基礎
    • Web應用結構(框架)
    • 配置tomcat運行web項目
    • 與前端交互原理
    • 問題整理
    • Java web基礎知識
    • Java web調試
    • 預研結論

web rdp預研 web應用程序部分

??來自很多年前的筆記,只是一個歸檔,不做更新!??

預研目的

1、預研官方教程
學習官方java、前端代碼,構建自己的web應用程序,使用guacamole api 和Maven,學會如何編譯打包該項目war。
正如官網所言Guacamole 是一個API,其中一個使用guacamole最好方式是構建自己的Guacamole驅動web應用程序。

相關基礎

Guacamole有一個代理守護進程guacd,它用于通信使用遠程桌面協議。從web應用程序角度,它不關注guacd動態加載協議插件。Web應用程序關注的只是連接到4822(guacd默認監聽端口),使用guacamole協議。

官方提供了一些簡單的java api(java類)已經實,現了guacamole協議,用于guacd和javascript之間傳遞。

利用這些java類的一個典型的web應用程序只需要以下內容。

  • 一個類繼承自GuacamoleHTTPTunnelServlet,該類作用是提供HTTP-based隧道在javascript客戶端(guacamole-common-js)和guacd。
  • GuacamoleHTTPTunnelServlet是一個抽象類,做為Guacamole API已經提供了多種方法,方便你使用隧道。

    如果您不想使用這個類,而是使用自己的隧道機制,如WebSocket,這很好;JavaScript (guacamole-common-js)對象(js對象guacamole)提供了一些通用的接口。

  • 一個web網頁包含js文件(guacamole-common-js),使用client和 tunnel對象連接web應用程序。
  • JavaScript API包括了作為client的Guacamole協議的完整實現、HTTP隧道和websocket隧道的實現,以及鼠標/鍵盤/觸摸輸入抽象。
    JavaScript的鼠標和鍵盤支持是非常繁瑣的,Guacamole client對象提供了與其他組件api交互。

    如何你想實現認證,你可以繼承GuacamoleHTTPTunnelServlet等,官網就是這么實現的。你還可以封裝做很多事,這些的基礎都很簡單:你有一個隧道,允許JavaScript客戶端與guacd溝通,你有js client客戶端,在guacamole-common-js最難的部分已經提供。

    Web應用結構(框架)

    官方guacamole項目使用Maven構建的。官方Guacamole項目有一個Maven倉庫對于java和javascript APIs,寫一個基于guacamole應用使用Maven會更加容易。Maven將自動下載和使用Guacamole API。

  • pom.xml
    所有的Maven項目必須有一個項目描述文件pom.xml文件,在項目的根目錄。
    這個文件描述了項目依賴和一些構建必須。
    不像其它構建工具如apache ant 或 gnu autotools,Maven依照配置文件約定:項目文件必須放置到特定位置,項目依賴必須完整的描述在pom.xml中。做到這些,構建將能自動化。
  • 2.WEB-INF/web.xml
    在項目構建之前,需要一個web應用程程序部署描述文件web.xml。這個文件是JAVA EE構建.war的必須文件,可以被服務容器(servlet container)讀取,當web應用程序部署時。對于Maven構建.war時,使用該文件,它必須放置在src/main/webapp/WEB-INF/

  • index.html
    有了web.xml文件以及pom.xml,web應用程序將成功構建。

  • 更新pom.xml
    有了基本的pom.xml,我們需要修改pom.xml指定哪些組件會被使用。
    可以看到官方源碼項目,這些都已經寫好。注意有兩個要注意的點:

  • 指定我們要使用的java版本。
  • <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.3</version><configuration><source>1.6</source><target>1.6</target><compilerArgs><arg>-Xlint:all</arg><arg>-Werror</arg></compilerArgs><fork>true</fork></configuration></plugin>
  • 我們需要來自guacamole-common-js的文件自動包含在.war中。
  • 編譯和打包apache guacamole
  • 運行 mvn 包
  • $ mvn package

    Maven將下載任何需要依賴用于構建.jar文件。一旦所有依賴被下載, .war文件將被創建到當前目錄的guacamole/target/子目錄

    此命令包含一系列過程:validate–>compile–>test–>package。

    Maven根據pom文件里packaging的配置,決定生成jar文件還是war文件,并放到target目錄下。

    此命令需要在項目的根目錄(也就是pom.xml文件所在的目錄)下運行,maven才知道打包哪個項目。

  • 拷貝.war文件到你的web容器中。
  • 編譯遇到問題
    因為沒有聯網,
    單獨編譯模塊guacamole-example報
    Error:(22, 26) java: 程序包javax.servlet.http不存在
    單獨編譯模塊Guacamole庫 報
    Error:(23, 23) java: 程序包javax.websocket不存在
  • 思路:

  • 用能聯網的設備下載一次,copy下載到本地的jar文件到你的本地倉庫(Z:\Users\callee.m2\repository)。
  • 搭建本地私有倉庫nexus。
  • 本地倉庫是遠程倉庫的一個緩沖和子集,當你構建Maven項目的時候,首先會從本地倉庫查找資源,如果沒有,那么Maven會從遠程倉庫下載到你本地倉庫。
    推薦此方法(測試通過):cp你成功下載的Z:\Users\callee.m2\repository目錄,到你IDEA文件配置里面maven目錄下的conf/setting.xml中設置你的本地緩存repository目錄。

    至此,你用IDEA,選擇build,可以構建生成任意模塊的的class文件。
    仍然找不到.war。
    生成.war就是打包,打包.war,無非就是將web目錄下的文件打包,即做成文件夾,把web目錄下的目錄放入到這個文件夾。

    如果有勾選Build on make選項,可以在運行項目時生成.war包。如果沒有勾選,可以通過Build–>Build Arifacts來完成war包。

    配置tomcat運行web項目

  • 配置tomcat容器
    打開菜單Run–>選項Edit Configuration
    點擊+號,選擇Tomcat Server -->選擇“Local”
    點擊”Application server”后面”Configue…”,彈出Tomcat Server窗口,選擇本地安裝的Tomcat目錄–>OK

  • 在tomcat中部署并運行項目
    再次進入部署界面

    點擊 + 在Deployment中,選擇要部署的工程。
    此處選擇xxx.war作為部署包。添加訪問路徑 Application context,一般為項目名,然后點擊OK。如這里的test,它會在tomcat的webapp根目錄下創建這個test目錄。

  • 在主界面中Application Servers中就可以看到部署的工程,點擊Run/Connect就可以運行Tomcat服務器。
    點擊Run即可運行tomcat服務器。

    與前端交互原理

  • 第一次請求java處理流程
    通過web.xml部署描述文件,看到一個過濾器類,監聽器。跟蹤Listener是監聽器,用于監聽Servlet。
    GuacamoleServletContextListener它會初始化執行,實例化兩個類
    environment = new LocalEnvironment(); // 讀取guacamole.properties文件,獲取到連接mysql信息sessionMap = new HashTokenSessionMap(environment);//會話實例

  • 登錄流程分析

  • 前端請求http://10.0.8.103:8080/guacamole/api/tokens
    POST傳
    username:admin
    password:admin
    認證使用的類文件
    org\apache\guacamole\rest\auth\AuthenticationService.java
    中的authenticate方法具體處理認證:對比賬號密碼
    –>authenticate該函數執行具體的認證對比
    –>authenticateUser 可以同時支持多種認證,循環多種認證方式,驗證用戶
    然后調具體的拓展類的authProvider.authenticateUser(credentials);
    –>return authProviderService.authenticateUser 來自org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java
    最終真正的對比驗證密碼在:
    org/apache/guacamole/auth/jdbc/user/UserService.java的
    public ModeledAuthenticatedUser retrieveAuthenticatedUser方法:
    先是查庫,檢查用戶名,庫中有該用戶名再進行下一步,
    // Retrieve corresponding user model, if such a user existsUserModel userModel = userMapper.selectOne(username);
    發現userMapper.xml中有id為selectOne的元素,內容即為查庫的sql語句。
    驗證密碼
    // Verify provided password is correctbyte[] hash = encryptionService.createPasswordHash(password, userModel.getPasswordSalt());if (!Arrays.equals(hash, userModel.getPasswordHash())) return null;

  • java處理 關鍵字/api
    serve(“/api/*”).with(GuiceContainer.class);
    配置GuiceContainer類(servlet)對所有以/api/開頭的進程服務。路徑風格語法注冊servlet。

  • 問題整理

  • 編譯打包的war部署到tomcat中,打不開,發現有兩個500響應,界面空白

    在項目代碼中,全局搜索app.js,發現是java處理的動態生成,你在服務器端是找不到這兩個文件的。
    問題分析定位,在項目中全局搜素app.js,不是服務器本身存在的,是java動態生成的。Java讀取/guacamole.min.js /guacamole.min.css 動態生成的app.js和app.css。編碼打包的war中沒有這兩個文件。從官方.war中解壓的包中,copy出來即可。
  • // Dynamically generate app.js and app.css from extensionsserve(“/app.js”).with(new ResourceServlet(new SequenceResource(javaScriptResources)));serve(“/app.css”).with(new ResourceServlet(new SequenceResource(cssResources)));

    為什么沒有壓縮打包js、css呢?
    Guacamole模塊的pom.xml中有描述JS/CSS Minification Plugin 該插件

    思路1:分析guacamole-common-js模塊,不能正常壓縮打包的原因。似乎是minify-maven-plugin這個插件的問題。
    思路2:直接把這兩個壓縮好的文件,放到源碼的guacamole\src\main\webapp下。到時打包war自動會打包上。
    暫時使用思路2,測試通過。

  • window下mysql認證方式配置
    在啟動服務時候,獲取guacamole配置文件路徑
    environment = new LocalEnvironment();
    它是同時可以有多種認證方式,在加載拓展是加載相關的認證類實例。
    private void loadExtensions(Collection javaScriptResources, Collection cssResources)
    –>如下,在guacamole配置路徑下,找目錄extensions
    File extensionsDir = new File(environment.getGuacamoleHome(), EXTENSIONS_DIRECTORY);
    本例中,位置如下:Z:\Users\callee\guacamole\extensions
    把你下載的數據庫認證拓展jar文件解壓放置到該目錄即可。
    同時注意要下載mysql數據庫連接jar文件到lib目錄(lib目錄和extension同級)。
  • 報錯:### Cause: java.sql.SQLException: Access denied for user ‘guacamole_user’@‘10.0.8.89’ (using password: YES)
    發現連接的是tomcat所在ip,因此,需要在配置文件Guacamole.properties中指定mysql服務地址信息。經測試 是配置文件中mysql密碼填錯了。

    Guacamole.properties是guacamole的主要配置文件。這個文件決定了guacamole如何連接guacd,也會配置安裝的 拓展驗證屬性。

    guacamole.properties配置如下:

    #guacd properties guacd-host: 10.0.8.103 # MySQL properties mysql-host: 10.0.8.103 mysql-hostname: 10.0.8.103 mysql-port: 3306 mysql-database: guacamole_db mysql-username: root mysql-password: 123456

    Java web基礎知識

    略。需掌握基礎知識:
    1) 理解并掌握servlet生命周期,接口servlet,以及實現類HttpServlet。
    2) 服務器傳遞給servlet的對象Request、Response、ServletConfig對象、ServletContext(代表當前應用)、session、cookie。 掌握servlet常用api。
    3) JDBC
    4) Java注解、依賴注入概念知識點、
    5) Guice輕量級依賴注入框架知識

    Java web調試

    IDEA常用調試快捷鍵
    F8 單獨調試
    F7 跳入該方法
    Shift + F8 跳出該方法
    F9 走到下一個斷點

    預研結論

    代碼可控,項目成功編譯打包,達到預期。

    總結

    以上是生活随笔為你收集整理的guacamole 纯web rdp预研:web应用程序部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。