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是一個抽象類,做為Guacamole API已經提供了多種方法,方便你使用隧道。
如果您不想使用這個類,而是使用自己的隧道機制,如WebSocket,這很好;JavaScript (guacamole-common-js)對象(js對象guacamole)提供了一些通用的接口。
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。
所有的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指定哪些組件會被使用。
可以看到官方源碼項目,這些都已經寫好。注意有兩個要注意的點:
Maven將下載任何需要依賴用于構建.jar文件。一旦所有依賴被下載, .war文件將被創建到當前目錄的guacamole/target/子目錄
此命令包含一系列過程:validate–>compile–>test–>package。
Maven根據pom文件里packaging的配置,決定生成jar文件還是war文件,并放到target目錄下。
此命令需要在項目的根目錄(也就是pom.xml文件所在的目錄)下運行,maven才知道打包哪個項目。
因為沒有聯網,
單獨編譯模塊guacamole-example報
Error:(22, 26) java: 程序包javax.servlet.http不存在
單獨編譯模塊Guacamole庫 報
Error:(23, 23) java: 程序包javax.websocket不存在
思路:
本地倉庫是遠程倉庫的一個緩沖和子集,當你構建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。
問題整理
在項目代碼中,全局搜索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,測試通過。
在啟動服務時候,獲取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: 123456Java 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应用程序部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ui设计师的职责与岗位要求
- 下一篇: 新视野大学英语4期末考试真题—集大内部期