前端传不同的类名(比如 com.xxx.UserService ),后端拿到这个名字反射调用它的方法,实现一个 api 动态配置。。。

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