基于vaadin框架的网络空间资产聚合平台

Posted on 2025-05-03  91 Views


搞安全的不要天天写代码,天天写代码会运气不好

但是需求又摆在那里

下次我大概可以试试“与需求和解”,只要我妥协,就没有需求,就不用写代码,就去多挖洞

但是今天先不妥协,因为目前资产聚合平台已经实现双引擎聚合了,这时候妥协就类似“嘴上喊着我不想上班了,但是还是去上班了,上了半天班又开始喊我不想上班了,然后下午请假”

效果图:

image

我知道很丑,但是我菜,要不你也来和我一起写代码?

上面绿绿的是quake的,下面表格里的是hunter的,聚合这块的目标是实现三引擎聚合,还有个fofa的没做

聚合的语法翻译是基于上次文章的代码来做的,属于本项目的小难点

基于语义分析的表达式代码转换 – zgbsm's note

不过今天不聊代码,主要介绍一下vaadin框架,以及这个聚合平台的设计目标和功能规划

关于vaadin

官网:Create Full-Stack Web Apps | Java Frameworks | Vaadin

这个框架年代久远了,但是它一直在更新,目前支持“前后端分离(但人不分离)”框架和“裁掉前端”框架;这两个模式对应官方文档的hilla框架和flow框架

我没用过它的前后端分离开发框架,但是个人理解它的前后端分离是类似于laravel的inertia.js,估计原理不一样,但是开发体验应该是一样的

vaadin框架是一个标准的服务端渲染框架,它目前最新版本的开发体验应该和微软的blazor差不多,可以理解为spring框架的blazor,它把用户的每个输入、每个鼠标点击、每个前端事件统统发到后端,然后后端再通知前端怎么和用户互动,可以说这一块和blazor的设计基本一样

不过也有和blazor不一样的地方,blazor和后端连接是通过SignalR实现的,而vaadin就是单纯的http请求,不过vaadin有一个server-push模式,就如同server-push的字面意思一样,该模式支持后端主动推送消息到前端,这个模式是基于websocket实现的

我这次主要用了它的flow框架,感觉写起来像swing,跟新颖的前后端分离框架相比,虽然画UI繁琐了一点,但是大量减少了http请求的代码,而且不用webstorm和idea切来切去,写代码体验舒服多了。不过flow框架调试起来很恶心,改完代码之后要热重载,重载失败就只能重启了,重启还巨慢

由于vaadin对server-push的良好支持,使得它对“多人运动”服务的开发非常友好,这次我主要用server-push来做ui异步加载

vaadin也有一个活跃的社区,因为官方UI库比较贫瘠,热爱vaadin的社区开发者也会发布一些自己写的UI插件,目前我这里官方的组件是够用的 Vaadin Directory Search | Vaadin Add-on Directory

总的来说,就是如果你觉得写java很爽,不想写js,那你就可以用vaadin,因为它可以让你一直爽

关于聚合平台

聚合平台是一个好东西,自己也能用公司也能用,自己用的时候主要两个需求:1、每天监控目标新增资产,2、聚合多个平台的结果。公司用的时候主要三个需求:1、不告诉大伙密钥的情况下共享密钥,2、记录大伙密钥使用量,(然后偷偷在绩效工资里扣。←没人说过这话,但我觉得可以降本增效),3、刚刚上面说的两个自己的需求

除了上面的主要设计目标,还有一些小细节需要关注,比如用户在查询数据的时候可能要翻页,向后翻页好办,直接向所有测绘引擎拉数据就可以,那向前翻页呢?如果这时再去找测绘引擎拉数据,那我的钱就要被拉完了,你想想,3引擎聚合,拉一下就是3倍的费用;这时可以考虑做一个会话缓存,用户每次查询的时候启动一个查询会话,查出来的结果塞到会话里,只要用户不关掉页面,或者留着url,那就能随时脉动回来

还有去重功能,3个平台的数据总会有交集的,不可能让人看了又看了又看了又看吧,所以数据在渲染出来之前必须检查重复

还有导出功能,因为聚合平台是“既满足个人需求又满足公司需求”的,那必然要支持自己的密钥和公司的密钥共存;但是又要做好保护,不能允许自己的密钥被其他人使用,这在鉴权上是容易实现的,但是如果我们要分享测绘结果呢?分享链接一发,大伙开始看站了,渐渐被站淹没,不知所措,不断的消耗密钥资源,那这时就需要切换到接受分享的人的密钥了,这个机制虽然可以实现,但是略显复杂,考虑到主要设计目标并不侧重分享功能,干脆就做个导出数据的功能算了,导出的数据默认所有人可见,如果数据量不够,可以在之前的基础上接着导

最后复制URL一定要方便,起码要比hunter和quake方便,因为感觉它俩不是很方便;我干活的浏览器和网上冲浪的浏览器是分开的,怕被蜜罐打CSRF

基于我们的设计目标,就可以开始技术选型了,web框架这块用的vaadin,不说别的,因为我是个人开发者,一直写java可以一直爽,而且写java一定要配静音红轴,写快了有一种浓浓的java感

数据库用的postgres,因为这个数据库资源占用不高,而且因为要支持多个平台的数据格式存储,所以必须要对json有良好支持;大伙可能会说为什么不用mongo呢?它对json的支持多好,主要是因为vaadin + spring security对SQL的支持比NOSQL好一些,写代码更省事,而且mongo有点肥,吃内存多了点;至于MYSQL,速度稍微有点慢,而且费内存,下次再用

然后好像就没啥的,比较重要的功能就查看、导出吧,资源统计那都是次要的,管理员大概心里有数就行;只要心中有密钥,密钥就不会消失;如果管理员忘记统计密钥余量,或者没有对耗钱大户及时封禁,那说明管理员心里没有密钥,那我们就要劝密钥和管理员分手,换一个管理员


你好