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

news2024/11/19 23:28:15

文章目录

  • 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应用程序只需要以下内容。

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

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

预研结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向对象【成员变量与局部变量、方法声明与作用】

文章目录 成员变量局部变量成员变量与局部变量的区别 方法方法的作用方法的声明 成员变量 Java中的成员变量是指类中声明的变量&#xff0c;也称为实例变量或属性。它们与方法一样属于类的成员&#xff0c;不同之处在于&#xff0c;它们存储在对象(堆)中而不是栈中&#xff0c;…

基于灰色预测模型的负荷预测(matlab程序)

0.代码链接 基于灰色预测模型的负荷预测&#xff08;matlab程序&#xff09;资源-CSDN文库 1.简述 灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过鉴别系统因素之间发展趋势的相异程度&#xff0c;即进行关联分析&#xff0c;并对原始数据进行生成处理来…

python:并发编程(二十六)

前言 本文将和大家一起探讨python并发编程的实际项目&#xff1a;win图形界面应用&#xff08;篇八&#xff0c;共八篇&#xff09;&#xff0c;系列文章将会从零开始构建项目&#xff0c;并逐渐完善项目&#xff0c;最终将项目打造成适用于高并发场景的应用。 本文为python并…

ADAS(高级驾驶员辅助系统)

什么是 ADAS ADAS —— 高级驾驶员辅助系统&#xff0c;包含一系列硬件和软件组件&#xff0c;自动起到驾驶员的多项作用。目前&#xff0c;常见的车辆 ADAS 功能包括自适应巡航控制、盲点检测、变道检测(车道偏离警告系统)、自动车道跟随和自动紧急制动、泊车。 L0到L2称为AD…

测试用例详解(强,硬,牛)

目录&#xff1a; 测试用例价值与体系黑盒测试方法论-等价类黑盒测试方法论-边界值黑盒测试方法论-因果图黑盒测试方法论-判定表黑盒测试方法论-场景法测试用例基础概念测试用例设计与评审面试测试测试用例设计搜索功能测试用例设计 1.测试用例价值与体系 测试用例概念测试…

【MQTT】| 搭建——在云服务器上搭建MQTT服务器

系列文章目录 【MQTT】| 搭建——在云服务器上搭建MQTT服务 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. EMQX简介2. EMQX部署3. EMQX一些操作指令3.1 启动EMQX3.2 停止EMQX3.3 检查EMQX运行状态3.4 卸载EMQX 4. EMQX设置4.1 进入EMQX控制面板 5. EMQX测试5.1…

模型评估 (Model Assessment)

1.模型评估 (Model Assessment) 笔记来源于《白话机器学习的数学》 我们训练好模型后&#xff0c;要对知道这个模型到底好不好&#xff0c;定量描述这个模型好坏就是模型评估 把获取的全部训练数据分成两份&#xff1a;一份用于测试&#xff0c;一份用于训练。然后用前者来评估…

数据库实训报告3000字

数据库实训报告1 一、实习目的 认识实习是本科教学计划中非常重要的实践性教学环节&#xff0c;其目的是使学生了解和掌握电力生产知识、印证、巩固和丰富已学过的计算机专业课程内容&#xff0c;培养学生理论联系实际&#xff0c;提高其在生产实践中调查研究、观察问题、分析问…

银行账户管理系统

1. 目的与要求 1、目的: (1)熟练掌握 C语言的基本知识和技能: (2)掌握面向对象程序设计的基本思想和方法;(3)能够利用所学的面向对象基本知识和技能&#xff0c;解决简单应用的程序设计 2、基本要求:(1)利用面向对象的方法以及 C的编程思想来完成系统的设计;(2)在设计的过程中…

抽象工厂模式(Abstract Factory)

定义 抽象工厂是一种创建型设计模式&#xff0c;它能创建一系列相关的对象&#xff0c;而无需指定其具体类。 前言 1. 问题 假设你正在开发一款家具商店模拟器。你的代码中包括一些类&#xff0c;用于表示&#xff1a; 一系列相关产品&#xff0c;例如椅子&#xff08;Chai…

091基于深度学习的手写汉字数字识别含10多种模型

emo仓库和视频演示找091期&#xff1a; 银色子弹zg的个人空间-银色子弹zg个人主页-哔哩哔哩视频 效果展示图如下&#xff1a; 代码文件展示如下&#xff1a; 运行01数据集文本生成制作.py可以读取图片路径保存再txt文本中&#xff0c; 运行02train.py可以对txt文本中的图片路…

同程数科基于 Apache Doris 构建统一实时数仓,查询提速数十倍!

本文导读&#xff1a; 同程数科是同程集团旗下的旅游产业金融科技服务平台&#xff0c;为上下游企业和个人消费者提供数字金融科技服务。近年来&#xff0c;随着同程数科业务的不断拓展和用户量的增加&#xff0c;高效可靠的一站式数据中心建设已成为必不可少的需求。为帮助业…

团体程序设计天梯赛-练习集L2篇④

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器

文章目录 官方文档往期回顾零基础笔记项目实战&#xff08;已完结&#xff09; WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式Style样式行内样式行外样式如果是简单样式&#xff0c;可以这么写如果是复杂样式 WPF样式继承WPF触发器单条件触发器多条件触发 …

LLDP(链路层发现协议)详解及C/C++代码实现

LLDP&#xff08;链路层发现协议&#xff09;是一种IEEE标准协议&#xff08;IEEE 802.1AB&#xff09;&#xff0c;它定义了封装在以太网帧中的消息&#xff0c;目的是通过默认情况下每30秒从每个端口定期重传一次&#xff0c;为设备提供一种向LAN&#xff08;局域网&#xff…

20个Java编程技巧

1. 把字符串常量放在前面 通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意&#xff0c;就像这样&#xff1a; 这是毫无疑问的&#xff0c;把一种表达式转换成另一种更好的表达式&#xff0c;并不会失去什么。只要我…

mysql锁机制及MVCC底层原理

一、锁介绍 按性能可分为乐观锁&#xff08;适用于读多写少的情况下&#xff0c;如果是写多&#xff0c;导致过多cpu空转&#xff0c;影响性能&#xff09;和悲观锁&#xff08;适用于写多的情况&#xff09;按数据库操作粒度可分为表锁、页锁、行锁按数据库操作类型可分为读锁…

UE4/5动画系列(1.模板制作)

目录 动画模板制作 同步模板组制作 有模板做什么都方便&#xff0c;所以这里我们做一个动画蓝图的模板&#xff08;动物专用&#xff09; 动画模板制作 第一步创建一个动画蓝图的模板 然后找到第三人称的模板&#xff0c;将其模板的蓝图改名&#xff1a; 在动画蓝图的模板里…

团体程序设计天梯赛-练习集L2篇②

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

首个跨云元数据KV存储Xline正式进入CNCF沙箱

2023年6月13日&#xff0c;云原生计算基金会&#xff08;CNCF&#xff09;宣布Xline正式被纳入CNCF沙箱(Sandbox&#xff09;项目。Xline是由达坦科技&#xff08;DatenLord&#xff09;于2022年年底推出的开源项目&#xff0c;是一个用Rust语言写就的&#xff0c;用于元数据管…