首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

如何重构?

  •  
  •   WatcherHangzhou · 2018-01-06 14:10:11 +08:00 · 1704 次点击
    这是一个创建于 707 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2018-01-06 14:50:49 +08:00
    解决了,

    ORM 支持通过注释来限制 int 大小,

    于是我写了个脚本,还好要限制大小的字段名都类似(都是 quantity 这种名字), 在那些要限制大小的实体类的属性代码附近,加上用于限制 int 大小的注释就好了,超过大小仍旧抛异常信息,但不返回数据库的异常信息。
    8 回复  |  直到 2018-01-06 15:33:27 +08:00
        1
    zhx1991   2018-01-06 14:19:30 +08:00
    底层设计不合理, 怎么改都很恶心.

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

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

    有 request.getInt("XX") 获取 int 值, 我在考虑重新注入个新的 request 重写这个 getInt 方法,判断参数 XX 是不是要限制最大值的那几个字段
        6
    lihongjie0209   2018-01-06 15:01:32 +08:00
    @WatcherHangzhou #5 这不是个好习惯, 后面想要重构就会遇到你现在的问题.
        7
    bxb100   2018-01-06 15:29:02 +08:00
    可以试试 xwork-validator, hibernate validate
        8
    cxbig   2018-01-06 15:33:27 +08:00
    一般用户接口,我们都是前后端都验证的。
    前端可以规范一般用户输入,对于恶意的 POST,后端会再次验证 token 和 data。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1197 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 18:12 · PVG 02:12 · LAX 10:12 · JFK 13:12
    ♥ Do have faith in what you're doing.