• 请不要在回答技术问题时复制粘贴 AI 生成的内容
WatcherHangzhou
V2EX  ›  程序员

如何重构?

  •  
  •   WatcherHangzhou · Jan 6, 2018 · 3308 views
    This topic created in 3081 days ago, the information mentioned may be changed or developed.

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

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

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

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

    Supplement 1  ·  Jan 6, 2018
    解决了,

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

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

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

    如果你想一劳永逸的话, 写一个 Filter 吧, 在入口函数处理之前都要经过 Filter 的
    WatcherHangzhou
        5
    WatcherHangzhou  
    OP
       Jan 6, 2018
    @lihongjie0209

    有 request.getInt("XX") 获取 int 值, 我在考虑重新注入个新的 request 重写这个 getInt 方法,判断参数 XX 是不是要限制最大值的那几个字段
    lihongjie0209
        6
    lihongjie0209  
       Jan 6, 2018
    @WatcherHangzhou #5 这不是个好习惯, 后面想要重构就会遇到你现在的问题.
    bxb100
        7
    bxb100  
       Jan 6, 2018
    可以试试 xwork-validator, hibernate validate
    cxbig
        8
    cxbig  
       Jan 6, 2018
    一般用户接口,我们都是前后端都验证的。
    前端可以规范一般用户输入,对于恶意的 POST,后端会再次验证 token 和 data。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1039 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 23:13 · PVG 07:13 · LAX 16:13 · JFK 19:13
    ♥ Do have faith in what you're doing.