如何重构?

2018-01-06 14:10:11 +08:00
 WatcherHangzhou

维护一个老系统,有很多让用户输入 int 字段值的接口,且前端没做数字范围校验,

数据库 int 字段值有最大值 21 亿多点,很多 html 表单里用户可以直接提交这种 int 值,

于是报错到数据库时就抛超出数据库数字范围异常了。

这种 html 表单很多,数据库实体类也很多,六七十个吧,我是应该人肉手动在所有 XX 是 int 类型的 setXX 方法里,判断 XX 大于最大值,就覆盖为最大值,还是研究代码找一种改动最少的办法,让后端判断是 int 类型,且数字大于最大值时用 int 最大值覆盖掉?

2476 次点击
所在节点    程序员
8 条回复
zhx1991
2018-01-06 14:19:30 +08:00
底层设计不合理, 怎么改都很恶心.

感觉前端做限制更简单.
wekw
2018-01-06 14:26:21 +08:00
直接写一个检查函数,把需要过滤的字段名传进去,做统一校验和修改。
southsala
2018-01-06 14:27:45 +08:00
如果不怕费工夫最好后端限制,而且不光是 int,其他字符串也要用正则限制好
lihongjie0209
2018-01-06 14:37:20 +08:00
你难道在 Controller 中直接 Request.getParam()???? 不应该是用 DTO 接受参数吗? 一般的框架都有参数绑定异常的处理方式, 不需要自己手写.

如果你想一劳永逸的话, 写一个 Filter 吧, 在入口函数处理之前都要经过 Filter 的
WatcherHangzhou
2018-01-06 14:42:49 +08:00
@lihongjie0209

有 request.getInt("XX") 获取 int 值, 我在考虑重新注入个新的 request 重写这个 getInt 方法,判断参数 XX 是不是要限制最大值的那几个字段
lihongjie0209
2018-01-06 15:01:32 +08:00
@WatcherHangzhou #5 这不是个好习惯, 后面想要重构就会遇到你现在的问题.
bxb100
2018-01-06 15:29:02 +08:00
可以试试 xwork-validator, hibernate validate
cxbig
2018-01-06 15:33:27 +08:00
一般用户接口,我们都是前后端都验证的。
前端可以规范一般用户输入,对于恶意的 POST,后端会再次验证 token 和 data。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/420575

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX