V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
BuilderQiu
V2EX  ›  问与答

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

  •  
  •   BuilderQiu · 2016-03-18 16:05:40 +08:00 · 5394 次点击
    这是一个创建于 3177 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    BTW :

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

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

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

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

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

    多个参数的话,一种是封装成一个对象吧,另外就只有手动写了?不知道还有其他办法没
    odirus
        22
    odirus  
       2016-03-18 22:18:33 +08:00
    @BuilderQiu 谢谢。
    Coande
        23
    Coande  
       2017-07-26 01:16:09 +08:00
    楼主有没有找到比较好的方法?一直比较疑惑。
    BuilderQiu
        24
    BuilderQiu  
    OP
       2017-07-26 09:32:44 +08:00   ❤️ 1
    @Coande
    目前还是用的 jsr-303 那一坨,复杂的验证就自定义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:39 · PVG 23:39 · LAX 07:39 · JFK 10:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.