找回密码
 加入我们
搜索
      
查看: 738|回复: 31

[软件] 前端JS代码如何操作后端程序产生的对象?

[复制链接]
发表于 2025-7-7 10:14 | 显示全部楼层 |阅读模式
本帖最后由 Sly 于 2025-7-7 10:55 编辑

朋友让帮忙问的问题+他刚发来的修改:
这里对象指的是不仅有数据字段,还有各种方法、包括对其他对象的引用的不可序列化对象。
因此存在2个问题:

1. 对象生命周期短:前后端每次连接中,后端产生的所有对象似乎都会在连接完成后被销毁。
虽然可考虑一些持久化方案,但这似乎只对单纯存储数据的对象适用。

2. 通信接口是非面向对象的:典型的HTTP方式中后端暴漏的接口完全就是一个个独立的方法,导致其丧失了面向对象的特性,造成写个代理模式的方法也无法方便操作。

这也就共同体现在前端无法操作后端的对象,只能使用传参一些数据、返回一些数据的方式。

好像主流框架,甚至主流平台体系完全不赞同这个做法。
方案一似乎可以用WebSocket方式解决,方案二毫无办法。

补充场合:
1、不需要大并发,不需要负载均衡
2、后端是内存安全平台,大概率他们就是Java那一套

补充用途:
1、该软件不是一个面向数据库开发的业务软件,只有少量数据需要存储。持久化数据不是程序关键;
2、也不是一个需要用户安全认证的软件,没有登录、更不需要RBAC;
3、该软件就是为了多人可以同时使用某个计算模型,并共享少量数据,而且为了方便使用采用的浏览器内运行的方式。
本质是将一个单机桌面软件拆分成服务端+客户端。后端产生的复杂业务对象,和当时桌面程序一样,可以直接无保留的供前端灵活使用。或者说改为Web程序也想这样,此时用Vue重写老WPF行了,同时可以减少对后端代码的修改。

评分

参与人数 1邪恶指数 +5 收起 理由
Barcelona + 5

查看全部评分

发表于 2025-7-7 10:20 | 显示全部楼层
安全原因呗,只要牵扯到指针,那必然会引起泄露,只要泄露那就可以干任何事情。
发表于 2025-7-7 10:23 | 显示全部楼层
传指针和 vtable 就行了
发表于 2025-7-7 10:23 | 显示全部楼层
朋友让帮忙问的问题

你说的这个朋友是不是你自己. 写过 200 行以上任何代码的人, 不会问出这种问题.
 楼主| 发表于 2025-7-7 10:25 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 10:27 编辑
xy. 发表于 2025-7-7 10:23
你说的这个朋友是不是你自己. 写过 200 行以上任何代码的人, 不会问出这种问题. ...


不是,我并不搞这种我觉得无聊的行业。
因为搞这种行业的人普遍更加有个凸显的特点,就是觉得别人都是傻逼,只有自己最牛逼。
发表于 2025-7-7 10:27 | 显示全部楼层
Sly 发表于 2025-7-7 10:25
不是,我并不搞这种我觉得无聊的行业。
因为搞这种行业的人普遍更加有个凸显的特点,就是觉得别人都是傻 ...


后半句不一定. 前半句还真是. 你问的这个还真就是纯啥比问题.
发表于 2025-7-7 10:34 | 显示全部楼层
你是经常被人当作傻逼吧,能问出这种问题也正常

评分

参与人数 1邪恶指数 -20 收起 理由
witson -20 接举报处理,请友善讨论

查看全部评分

 楼主| 发表于 2025-7-7 10:35 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 10:37 编辑
mawer111 发表于 2025-7-7 10:34
你是经常被人当作傻逼吧,能问出这种问题也正常


我不清楚这个问题具体想表达什么,我只是转发。
但是你的言论似乎更加凸显和证明了,果然那个行业就是互相认为是傻逼
发表于 2025-7-7 10:44 | 显示全部楼层
描述不清楚 功能不明确 打回重写
功能点都不清楚要干什么 怎么能解决问题
 楼主| 发表于 2025-7-7 10:44 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 10:59 编辑
casc 发表于 2025-7-7 10:44
描述不清楚 功能不明确 打回重写
功能点都不清楚要干什么 怎么能解决问题 ...


我让他补充一下

更新:他发来了。
发表于 2025-7-7 10:48 | 显示全部楼层
问题都描述不清楚,一直在纠结各种概念和定义,牛头不对马嘴

而且无论何种情况,把后端数据直接暴露出来修改都是应该严禁的,因为前端没有安全性可言

如果真想改,有个终极解决方案,直接装一个数据库编辑网页,比如phpMyAdmin,想怎么改后端怎么改
发表于 2025-7-7 10:55 | 显示全部楼层
上GraphQL接口,自己爱怎么折腾怎么折腾。
 楼主| 发表于 2025-7-7 10:57 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 11:10 编辑
sagnitude 发表于 2025-7-7 10:48
问题都描述不清楚,一直在纠结各种概念和定义,牛头不对马嘴

而且无论何种情况,把后端数据直接暴露出来修 ...


他补充了

他们这个软件就是单机桌面版软件改的,自己小组用,不需要安全性(登录这个功能都没有。前端可以随便修改甚至破坏后端的东西——虽然这么做没有必要),可用性和低成本的改造是更需要。

有个我自己发现的问题,好像不止一个人强调安全性,从2楼开始就强调。难道所有场合和用途的Web程序都必须讲安全性么?桌面程序讲了么,如果讲了哪来那么多内存修改器。所以如果本就是单机或者少量固定人用的Web程序,而且还不是数据库相关的,需要非得强调各种安全么?非故意情况下不出现运行bug不就行了么
发表于 2025-7-7 11:09 | 显示全部楼层
本帖最后由 lwmq 于 2025-7-7 11:13 编辑

我想了半天也没搞明白啥意思,web前端想调用后台对象无论如何不也是要通过http接口吗?
后台对象序列化给前端调用是什么鬼
-------------
想操作同一个对象把对象仍在web服务的内存里,前端传调用方法的参数不也就可以了吗?
有问题不去csdn查跑来chh问也是挺奇怪了
------------
话说都想到websocket了不如考虑一下jmx?反正都不是什么正经解决方案
发表于 2025-7-7 11:15 来自手机 | 显示全部楼层
既然这样,还搞什么前后端分离。。。
发表于 2025-7-7 11:19 | 显示全部楼层
Sly 发表于 2025-7-7 10:57
他补充了

他们这个软件就是单机桌面版软件改的,自己小组用,不需要安全性(登录这个功能都没有。前端可 ...

因为如果是正经软件,安全性这样子过不了验收,上线会出大事

即使是内部工具,也没法保证出问题之后可以追责

比如去年字节有个实习生直接改了线上训练的模型,哪怕是内部使用的工具,也不能没有安全性,也不能不讲操作审计

https://baike.baidu.com/item/202 ... 65011613?fr=aladdin

如果是自己用的,那这样回复,
1. 如果你用的后端语言支持 eval 这种万能灵药,直接前端写脚本后端执行
2. 数据是存在数据库,或者redis,用web客户端修改,数据库本来就是用来共享数据方便多人修改的
3. 如果后端支持在线编译或者在线替换 (hot load),比如java,c,自己做个方法执行下,做个rpc
4. 把后端直接暴露出来,如jmx
5. 除此之外你想修改数据,就必须每一个需求都写独立接口

针对此需求,数据库本来就是用来共享数据方便多人修改的,你不用数据库就是给自己加难度
发表于 2025-7-7 11:24 | 显示全部楼层
sagnitude 发表于 2025-7-7 11:19
因为如果是正经软件,安全性这样子过不了验收,上线会出大事

即使是内部工具,也没法保证出问题之后可以 ...

我是没想明白对应后端功能暴露一个接口给前端调用有什么麻烦的……
折腾了半天简直是脱了屁放裤子,哪怕前端传个方法名后端直接if else去调用都没这么多屁事
 楼主| 发表于 2025-7-7 11:24 | 显示全部楼层
lwmq 发表于 2025-7-7 11:09
我想了半天也没搞明白啥意思,web前端想调用后台对象无论如何不也是要通过http接口吗?
后台对象序列化给前 ...

他回复:

前端难以保持对后端某个对象的引用,难以快速的定位到某个对象,并且调用方法传入参数也可能涉及其他对象。
目前正在研究的一个办法是是后端维持一个对象哈希表,把key作为句柄的思路传递给前端,供前端未来调用和作为参数传入。然后用反射的思路把方法都暴漏给前端。
 楼主| 发表于 2025-7-7 11:24 | 显示全部楼层
forfans 发表于 2025-7-7 11:15
既然这样,还搞什么前后端分离。。。

因为还得多人使用
 楼主| 发表于 2025-7-7 11:25 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 11:39 编辑
sagnitude 发表于 2025-7-7 11:19
因为如果是正经软件,安全性这样子过不了验收,上线会出大事

即使是内部工具,也没法保证出问题之后可以 ...


追责的问题暂不存在,这就和服务器上有个台账excel大家都能编辑。当然确实存在一个人故意搞破坏删除的可能性,但为了方便可以不至于非得加上一些安全验证。程序的目的是为了大家方便共同操作计算和分享分析结果。数据安全不是矛盾。

其他的已经转发他了,谢谢你的回复。
发表于 2025-7-7 11:27 | 显示全部楼层
Sly 发表于 2025-7-7 11:24
他回复:

前端难以保持对后端某个对象的引用,难以快速的定位到某个对象,并且调用方法传入参数也可能涉 ...

说了半天就是想让对象常驻内存然后保证同一个用户反复使用啊……
那办法不是多了去了……
 楼主| 发表于 2025-7-7 11:28 | 显示全部楼层
lwmq 发表于 2025-7-7 11:27
说了半天就是想让对象常驻内存然后保证同一个用户反复使用啊……
那办法不是多了去了…… ...

不是同一个用户,可以给多个用户(客户端浏览器)调用。
发表于 2025-7-7 11:48 | 显示全部楼层
Sly 发表于 2025-7-7 11:28
不是同一个用户,可以给多个用户(客户端浏览器)调用。

你说的就是我说的意思
 楼主| 发表于 2025-7-7 12:03 来自手机 | 显示全部楼层
lwmq 发表于 2025-7-7 11:48
你说的就是我说的意思

可能还有的区别在于这个对象也还可以被其他客户端也调用

不是说某个对象固定隶属于某个客户端
发表于 2025-7-7 13:16 | 显示全部楼层
问错地方了 问对了的地方 你会被吐槽的更臭。。。
 楼主| 发表于 2025-7-7 13:37 来自手机 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 13:47 编辑
moresun23 发表于 2025-7-7 13:16
问错地方了 问对了的地方 你会被吐槽的更臭。。。


我也发现了,无论什么情况和前提,他们在某个时期内只认可这个时期的主流解决方案,其他都是异端。
发表于 2025-7-7 13:49 | 显示全部楼层
后端用数据库也没有问题啊,比如像sap这种,内存数据库,速度不慢啊,
发表于 2025-7-7 14:08 | 显示全部楼层
如果只是所有人实时查看和控制服务器上的一堆会变的数据,然后可以接受一些修改命令,这些数据本身都是一些简单的参数和计算结果

后端把各类数据都生成一个句柄,对所有数据的读写操作包装一层,把句柄和接受的操作以及参数存到数据库里

前端读:用MQ监听变化(MQTT,etc),实时显示
前端写:把 句柄+参数+操作 包装成一个命令,发到MQ队列里
后端读:监听对象变化,或者每1秒广播一次所有数据的句柄和状态
后端写:监听命令队列,根据命令对数据依次进行操作



其实说到底就是一个腾讯文档
 楼主| 发表于 2025-7-7 14:22 | 显示全部楼层
smallanntse 发表于 2025-7-7 13:49
后端用数据库也没有问题啊,比如像sap这种,内存数据库,速度不慢啊,

因为大部分内存数据库也只能保存数据,或者说对象需要是可序列化的。

对象中的其他引用就没了。
 楼主| 发表于 2025-7-7 14:25 | 显示全部楼层
本帖最后由 Sly 于 2025-7-7 14:28 编辑
sagnitude 发表于 2025-7-7 14:08
如果只是所有人实时查看和控制服务器上的一堆会变的数据,然后可以接受一些修改命令,这些数据本身都是一些 ...


嗯嗯,目前确实是这个思路

只不过对象的某个方法里面的某个参数也有可能是其他对象,对象和对象之间是有关系的。

所以打算对象的引用在前端就用句柄代替。
后端维护一个哈希表,每生成一个对象就生成一个句柄作为key传给客户端。客户端用句柄来索引到对象,并且调用方法整个过程依靠反射来实现,反射也全部暴漏给前端。
方法如果需要的某个对象作为参数,也用句柄作为参数来代替对象的引用,后端在反射的相关代码里面再查表反转过来。

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-7-7 22:51 , Processed in 0.012802 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表