BuilderQiu
V2EX  ›  问与答

求分享, Java 有没有什么数据校验的好办法?

  •  
  •   BuilderQiu · Mar 18, 2016 · 6383 views
    This topic created in 3891 days ago, the information mentioned may be changed or developed.

    大家有没有什么 Java 数据校验的好方法?除了jsr-303那一套的。求分享~

    BTW :

    • 大家都是在什么地方做数据校验的?Controller、Service?
    • 用检验框架(比如?)还是全手写?感觉 N 多字段,手写简直崩溃。
    • 像Hibernate-validator这种实现,在字段上增加注解来进行校验,如果同一个对象,不同的校验场景如何处理?
    24 replies  •  2017-07-26 09:32:44 +08:00
    3dwelcome
    3dwelcome
    Mar 18, 2016
    1
    如果只是防止第三方非法修改数据内容,个人觉得数据发送前做个全局数据流 hash, 然后签名就可以了。

    签名不能伪造 => hash 值无法被第三方修改 => 数据流安全。
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    2
    @3dwelcome
    不是防篡改这种场景哈 ,就基本的数据校验,字段非空,电话号码格式这种

    防篡改加 Hash 这种也只适合服务器之间约定好的通讯吧,客户端 Hash 也没用吧
    88250
    88250
    Mar 18, 2016
    3
    Controller 参数格式校验一直手写, Service 里面做参数相关业务逻辑的校验
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    4
    @88250
    现在也基本都是手写的,不过感觉太繁琐了,场景一多,判断写一堆
    Sharuru
    Sharuru
    Mar 18, 2016
    5
    =m= 看具体环境吧,比如我现在写的这个,全靠前端 validation 来检测,后台抓个大异常,然后防一下 SQL 注入。
    88250
    88250
    Mar 18, 2016
    6
    @BuilderQiu 手写比较好控制,其实代码也不会太多的,而且调试方便
    fwrq41251
    fwrq41251
    Mar 18, 2016
    7
    spring mvc @Validated
    可以指定 group 。
    slixurd
    slixurd
    Mar 18, 2016
    8
    如果传个 Bean 进来,或者传过来的数据可以反序列化为 VO ,我们都把校验逻辑会写在 VO 里
    这样可以简单复用一下,比较一个 VO 用在多个地方很正常
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    9
    @Sharuru
    后端也得检验哇
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    10
    @88250
    主要是代码都差不多,判空之类的
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    11
    @fwrq41251
    分组到是可以~不同场景用不同组
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    12
    @slixurd

    不同的校验场景没法弄吧这样,而且现在的 Bean 基本都是贫血的吧
    Ouyangan
    Ouyangan
    Mar 18, 2016
    13
    这个问题我也很困惑 , 关注
    88250
    88250
    Mar 18, 2016
    14
    @BuilderQiu 工具类调用,封装一下返回文案范围值啥的,也就 1 行代码..
    murmur
    murmur
    Mar 18, 2016
    15
    前端无论怎么做后端都要校验 但是有些东西必须失败一次才知道结果 比如唯一性校验 或者涉及外键关联的 那就囧了 是让 try 一下让他报错接着 还是真的去数据库校验一次呢
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    16
    @murmur
    😂这种一般都是去查一次吧?虽然还是可能查询的时候不存在,添加的时候已存在了最后进入报错流程……
    caixiexin
    caixiexin
    Mar 18, 2016 via Android❤️1
    17
    参数完整性,判空,长度,字符串个数的校验,用 jsr303 够用了呀。
    写一个 baseController ,在里面同一捕获 jsr303 的异常,并封装 response 。然后所有 controller 基础它。
    剩下的工作就是定义各种错误的 message 和新增接口的时候为每个请求类里面属性加注解了。
    另外, Hibernate-validato 不就是 jsr303 的实现吗😂
    caixiexin
    caixiexin
    Mar 18, 2016 via Android
    18
    @caixiexin 字符串个数 ->字符串格式
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016
    19
    @caixiexin
    我就是说 Hibernate-Validator 那种实现😂
    想了解看看还有木有其他办法😌
    odirus
    odirus
    Mar 18, 2016
    20
    @caixiexin 谢谢,我也有这个问题。。。一直不是非常明白。

    请教一下: hibernate validator 是挺好用的,但是万一我传入的参数不是一个 bean 里面的字段呢?谢谢。主要是写接口的时候,参数和 bean 没任何联系。
    BuilderQiu
    BuilderQiu
    OP
    Mar 18, 2016❤️1
    21
    @odirus

    多个参数的话,一种是封装成一个对象吧,另外就只有手动写了?不知道还有其他办法没
    odirus
    odirus
    Mar 18, 2016
    22
    @BuilderQiu 谢谢。
    Coande
    Coande
    Jul 26, 2017
    23
    楼主有没有找到比较好的方法?一直比较疑惑。
    BuilderQiu
    BuilderQiu
    OP
    Jul 26, 2017❤️1
    24
    @Coande
    目前还是用的 jsr-303 那一坨,复杂的验证就自定义
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4951 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    ♥ Do have faith in what you're doing.