前端传不同的类名(比如 com.xxx.UserService ),后端拿到这个名字反射调用它的方法,实现一个 api 动态配置。。。
1
hcymk2 2019 年 12 月 5 日
DWR
|
2
C02TobNClov1Dz56 2019 年 12 月 5 日
这个不够安全, 应该加点限制, 我们公司有类似的, 通过传入不同的 URL 资源地址, 然后解析后查询配置表, 然后反射 dubbo 调用. 真的有类似的. 完全可以实现.
注意, 前台只传标识, 类名啥的还是方自己版本的配置表里. |
3
eason1874 2019 年 12 月 5 日
Java 咋样不了解,我接触很多 PHP 程序都有类似操作。每个 API 是一个独立的类文件,类是根据变量名动态加载的,而变量名则是其他地方传入或者前端传入,加一个 API 的时候加一个类文件就可以了,删一个 API 的时候也是删那个类文件或者改名就可以了。
|
4
t123yh 2019 年 12 月 5 日 via Android
如果传送了具有危险的命令,怎么办呢
|
6
snw 2019 年 12 月 5 日 via Android
Linux 上那个 Snapcraft 好像也有类似的骚操作,各种包的命令文件都软链指向同一个可执行文件,但 snap 知道你要运行哪个。
|
7
CODEWEA 2019 年 12 月 5 日
很正常呀,以前的 php 路由不就是这样吗 c=控制器 m=方法
|
9
learnshare 2019 年 12 月 5 日 via Android
这么写 API 的也见过,处理得当的话,或许没太大区别
|
10
superrichman 2019 年 12 月 5 日
这种设计我觉得后面肯定会出安全问题
|
11
ClericPy 2019 年 12 月 5 日
就喜欢看这些骚操作哈哈
以前用 python 也干过类似的事情, 确实方便, 一个 route 让我接了几十个 utils..... 而且也方便一句 /doc 当场看文档, 至于安全问题, 做了限权和 slots, 问题不太大 不过后来就不这么折腾了, 看 doc 也用 swagger |
12
dremy 2019 年 12 月 5 日 via iPhone
文件系统即路由,没毛病呀
|
13
luozic 2019 年 12 月 5 日 via iPhone
模型最好统一,这里骚了,别的地方继续 mvc 或者 mvvm,之后维护你就知道啥叫蛋疼了。
|
14
areless 2019 年 12 月 5 日
可以的。加密一下。MySQL 开 ssl,前端直接写 sql 都可以的。node 的 ORM 改造下直接在浏览器端使用,很方便的。
|
15
darkforest8848 2019 年 12 月 5 日
以前我们的项目就是这么设计的
|
16
Samuelcc 2019 年 12 月 5 日 via Android 这种维护成本是不是有点高,重构火葬场
|
17
Evrins 2019 年 12 月 6 日 via iPhone
Play framework 1 就是这样的
|
18
Kaiv2 2019 年 12 月 6 日 via Android
建议使用 spring MVC
|
19
ershisi 2019 年 12 月 6 日
算不上骚操作,只要权限控制没问题就没啥毛病的吧
|
20
fengpan567 2019 年 12 月 6 日
之前做了个定时任务,就是这么搞的
|
21
uxstone 2019 年 12 月 6 日
低内聚 高耦合
boss 说归说,最终出 bug 还是你来加班改,如果甩给后来人不太厚道 |
22
greenlaw110 2019 年 12 月 6 日
@Evrins Playframework1 哪里是这样, route 配置在后端, 前端不可能传递后端的实现细节的, 这种不是骚操作, 这种是瞎操作
|
23
xuanbg 2019 年 12 月 6 日
后端 API 需要动态配置么?
前端模块动态加载倒是常规操作,无论是导航数据里面配路由的 web 应用还是配类名的桌面应用都是这个套路。 |
24
vanishcode 2019 年 12 月 6 日
dubbo 那一套,有公司是这么做的,前端+网关都是 ts
|
25
JasonLiHai 2019 年 12 月 6 日
这个以前做过
|
26
mskf 2019 年 12 月 6 日
java RMI?
|
27
keller 2019 年 12 月 6 日
坐下坐下 这是常规操作
|
28
opengps 2019 年 12 月 6 日
其实挺常见的,只不过传的不一定刚刚好是类名,可能得转一下,比如前端传 user,传 product
|
29
lihongjie0209 2019 年 12 月 6 日
|
30
deweixu 2019 年 12 月 6 日
把 bean 放到一个 map 中,前端传 key, 后端取出 bean 调用相关的方法处理
|
31
hoyixi 2019 年 12 月 6 日
传个 binary 对象或者代码,然后再组装调用,是不是更骚?
|
32
yuankui 2019 年 12 月 6 日
再怎么也搞个映射吧??
直接上类名,不担心安全问题? |
33
yeyuhan 2019 年 12 月 6 日
直播实现 RCE
|
34
xfriday 2019 年 12 月 6 日
rpc 么好了,哪有这么麻烦
|
35
Orenoid 2019 年 12 月 6 日
做好限制,问题不大。但是如果文档不完善,后来维护的可能会一脸懵逼。
|
36
RYAN0UP 2019 年 12 月 6 日 via iPhone
我司之前就这么干的。传 target method。
|
37
Tink PRO 这个可以的
|
38
th00000 2019 年 12 月 6 日
可以在前期先把这些对象都创建出来, 根据前端传递的方法, 去配置里直接拿出来调用, 速度会快很多
|
39
tabris17 2019 年 12 月 6 日
不怕被注入什么危险代码吗?
|
40
areless 2019 年 12 月 6 日 via Android
@lihongjie0209 mysql 是多用户的,在 mysql 库里添加用户权限咯,有的能写有的只读有的不让读。连接又不是持久的,读完就关,1000 个连接数能跑好多呢。myisam 一个用户生成一个表咯。。。以前 WordPress 多用户版插件是这样搞的。速度又快~
|
41
lihongjie0209 2019 年 12 月 6 日
@areless #40
1. 哪怕读完就关,1000 连接就是 1000 并发, 你的并发和连接数是相同的, 不好扩展。 2. 一个用户一个表, 如果我的系统有 20 个表用户可以访问, 我有 10000 个用户, 那么我需要 20 * 10000 个表?? |
42
jsq2627 2019 年 12 月 6 日
常规操作 常规操作..
|
43
vinHty 2019 年 12 月 6 日
印象里前公司某个 PHP 项目就是这样子搞的。。
一个主入口,根据类名、方法名反射拿到 bean 然后处理请求。。 ORZ |
44
areless 2019 年 12 月 6 日 via Android
@lihongjie0209 并发的概念太模糊,1 连接开关在 100ms 的话,1 个连接一分钟就能承受 600 次。1000 个连接一分钟。。。普通业务很难用完啊。myisam 表的限制是硬盘分区类型的最大文件数。这只是一个想法。通过客户端 js 读服务器内存中的 key value 数据库,并且这个内存 kv 是非堵塞写 mysql 的~~~内存不足就手动清一些不常用用户,如果用户回来了,这些用户绕过 kv 直接从 mysql 读数据。mysql 主要给后台做分析用。kv 建索引清数据,日常运维。这么一个构架
|
45
aguesuka 2019 年 12 月 6 日 via Android
关键字 webserver,这个技术早就有而且过时了
|
46
est 2019 年 12 月 6 日
说白名单的。那还用啥反射呢。直接一个大号的 switch 拉倒。
|
47
aguesuka 2019 年 12 月 6 日 via Android
Java API for XML Web Services
|
48
janxin 2019 年 12 月 6 日
正常操作啊
|
49
rockxsj 2019 年 12 月 6 日 via Android
我们也是这么干的啊 不然接口这么多写的过来?
|
50
lqf96 2019 年 12 月 6 日 via iPhone
这不就是 RPC 么,而且看起来有一股 gRPC 的即视感…
|
51
wc951 2019 年 12 月 6 日 via Android
现成的协议都有了,不就是 soap 吗
|
52
luozic 2019 年 12 月 6 日 via iPhone
强耦合,不过只玩一把,后面不维护的可以这么玩。
|
53
wwwyiqiao 2019 年 12 月 6 日
真 RPC
|
54
pain400 2019 年 12 月 6 日
好蠢啊。。。
|
55
Varobjs 2019 年 12 月 6 日
|
56
wslsq 2019 年 12 月 6 日
thinkphp3 就是这样做的。。
|
57
Vegetable 2019 年 12 月 6 日
这没什么吧,本质上就是一个路由的形式而已.
|
58
airfling 2019 年 12 月 6 日
你们可以把这些报名转为 md5 值,然后前台穿这些 md5 值过来,你们根据 md5 值对应的包名再反射
|
59
outerws 2019 年 12 月 6 日
其实不太懂,java 没有动态加载机制吧?应用的场景是什么呢?现有业务接口 A,突然需要新增接口 B 实现不重启新增接口并调用?
|
60
Rekkles 2019 年 12 月 6 日
约定大于配置啊 这个在 PHP 的 Laravel 和 composer 里面很常见的
|
61
winglight2016 2019 年 12 月 6 日
这就是个伪动态啊,并没有什么特别的优势,还不如在登录时下发一张路由表靠谱一些。
|
62
lj3lj3 2019 年 12 月 6 日
这不就和前段时间 ThinkPHP 爆出的那个漏洞异曲同工么😂 要搞也必须再搞个白名单
|
63
zsdroid 2019 年 12 月 6 日
你们 boss 还知道反射啊,厉害了。
|
64
Felldeadbird 2019 年 12 月 6 日
不知道大家认为有安全问题 是出于什么考虑呢? 白名单怎样实现? 我想到的最多就是一个 鉴权+ token 超时认证?前端很难去基于白名单来验证吧。?这里前端是 浏览器? 还是 APP ?
|
65
irobbin 2019 年 12 月 6 日
耦合了
|
66
KentY 2019 年 12 月 6 日
我觉得是 strategy pattern 的 use case.
但描述太简要, 无法确定. 后端一个 strategy manager 可以根据前端传过来的(不一定是类的 qualified name) token, key 等, 来选择 strategy 进行逻辑计算. |
67
0vv0 2019 年 12 月 6 日
港交所页面上的接口就是,不过更骚的是他们传个类似 sql 的参数
|
68
reus 2019 年 12 月 6 日
少见多怪。
|
69
JCZ2MkKb5S8ZX9pq 2019 年 12 月 6 日
好像跟做一个 token 没差啊,只是 token 作为方法名。
虽然不直接暴露 api,但 token 的算法不是还在前端嘛? 这种除非搞得更骚,更容易出错,而且一错永封,那可能可以拖慢攻击效率。 |
70
Torpedo 2019 年 12 月 6 日
有可维护的 graphql 啥的,就算你自己搞,最好完善一点
|
71
gbin 2019 年 12 月 7 日 via Android
swagger 了解一下:)
|
72
ecloud 2019 年 12 月 7 日 via iPhone
@chengyiqun +1 我的一个产品也是这样类似的方法,DB 里维护一个对应关系表,uri -- 方法名
|
73
waterlaw 2019 年 12 月 8 日 via Android
@Felldeadbird 安全问题应该是保证接口是用户有权限访问的,后端提供一个 url 接口告诉前端哪些方法可以调用(白名单),我的理解。
|
74
waterlaw 2019 年 12 月 8 日 via Android 应用场景不明确,初看可以参考 #66 的方法,用策略模式 + java 注解,反射, 前端传个 id, 后端写个存常量的文件 id=com.google.UserService#method,反射根据 id 查找对应方法。
|
75
PoetAndPoem 2019 年 12 月 9 日
@areless 直接写 sql, 岂不是真全栈,写一个 rest 就通用了吗
|