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

如何重构?

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

    维护一个老系统,有很多让用户输入 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
    zhx1991
        1
    zhx1991  
       2018-01-06 14:19:30 +08:00
    底层设计不合理, 怎么改都很恶心.

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

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

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