文章目录
- 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 走到下一个断点
预研结论
代码可控,项目成功编译打包,达到预期。