guacamole 纯web rdp预研: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应用程序只需要以下内容。

  1. 一个类继承自GuacamoleHTTPTunnelServlet,该类作用是提供HTTP-based隧道在javascript客户端(guacamole-common-js)和guacd。

GuacamoleHTTPTunnelServlet是一个抽象类,做为Guacamole API已经提供了多种方法,方便你使用隧道。

如果您不想使用这个类,而是使用自己的隧道机制,如WebSocket,这很好;JavaScript (guacamole-common-js)对象(js对象guacamole)提供了一些通用的接口。

  1. 一个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最难的部分已经提供。

扫描二维码关注公众号,回复: 15428656 查看本文章

Web应用结构(框架)

官方guacamole项目使用Maven构建的。官方Guacamole项目有一个Maven仓库对于java和javascript APIs,写一个基于guacamole应用使用Maven会更加容易。Maven将自动下载和使用Guacamole API。

  1. 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/

  1. index.html
    有了web.xml文件以及pom.xml,web应用程序将成功构建。

  2. 更新pom.xml
    有了基本的pom.xml,我们需要修改pom.xml指定哪些组件会被使用。
    可以看到官方源码项目,这些都已经写好。注意有两个要注意的点:

  1. 指定我们要使用的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>
  1. 我们需要来自guacamole-common-js的文件自动包含在.war中。
  1. 编译和打包apache guacamole
  1. 运行 mvn 包
$ mvn package

Maven将下载任何需要依赖用于构建.jar文件。一旦所有依赖被下载, .war文件将被创建到当前目录的guacamole/target/子目录

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

Maven根据pom文件里packaging的配置,决定生成jar文件还是war文件,并放到target目录下。

此命令需要在项目的根目录(也就是pom.xml文件所在的目录)下运行,maven才知道打包哪个项目。

  1. 拷贝.war文件到你的web容器中。
  1. 编译遇到问题
    因为没有联网,
    单独编译模块guacamole-example报
    Error:(22, 26) java: 程序包javax.servlet.http不存在
    单独编译模块Guacamole库 报
    Error:(23, 23) java: 程序包javax.websocket不存在

思路:

  1. 用能联网的设备下载一次,copy下载到本地的jar文件到你的本地仓库(Z:\Users\callee.m2\repository)。
  2. 搭建本地私有仓库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项目

  1. 配置tomcat容器
    打开菜单Run–>选项Edit Configuration
    点击+号,选择Tomcat Server -->选择“Local”
    点击”Application server”后面”Configue…”,弹出Tomcat Server窗口,选择本地安装的Tomcat目录–>OK

  2. 在tomcat中部署并运行项目
    再次进入部署界面
    在这里插入图片描述
    点击 + 在Deployment中,选择要部署的工程。
    在这里插入图片描述此处选择xxx.war作为部署包。添加访问路径 Application context,一般为项目名,然后点击OK。如这里的test,它会在tomcat的webapp根目录下创建这个test目录。

在主界面中Application Servers中就可以看到部署的工程,点击Run/Connect就可以运行Tomcat服务器。
点击Run即可运行tomcat服务器。

与前端交互原理

  1. 第一次请求java处理流程
    通过web.xml部署描述文件,看到一个过滤器类,监听器。跟踪Listener是监听器,用于监听Servlet。
    GuacamoleServletContextListener它会初始化执行,实例化两个类
    environment = new LocalEnvironment(); // 读取guacamole.properties文件,获取到连接mysql信息sessionMap = new HashTokenSessionMap(environment);//会话实例

  2. 登录流程分析

  1. 前端请求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;

  2. java处理 关键字/api
    serve(“/api/*”).with(GuiceContainer.class);
    配置GuiceContainer类(servlet)对所有以/api/开头的进程服务。路径风格语法注册servlet。

问题整理

  1. 编译打包的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,测试通过。

  1. 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 走到下一个断点

预研结论

代码可控,项目成功编译打包,达到预期。

猜你喜欢

转载自blog.csdn.net/inthat/article/details/131367467