资讯专栏INFORMATION COLUMN

Java验证

funnyZhang / 3295人阅读

摘要:校验器可以通过对象报告校验失败的信息接口定义示例如下,可以使用等工具测试用户名不能为空常用注解也可以自定义注解及其校验规则获取并初始化注解信息设置自定义校验规则人的姓名不能为空参考

Q: 为什么后端需要校验,只交给前端校验行不行
A: 前后端都需要校验
后端校验防止请求过来的非法数据,对后端进行破坏

Java后端常用的校验框架 Apache commons-validator

http://commons.apache.org/ 这个地址apache提供了常用的工具类,包括校验框架

提供了大量的校验器,如时间、数值、正则表达式、邮箱、URL等待

以IntegerValidator为例

IntegerValidator integerValidator = new IntegerValidator();
        
Integer value = integerValidator.validate("10");
System.out.println(value);
        
value = integerValidator.validate("G");
System.out.println(value);
/**
     * 

Validate/convert an Integer using the default * Locale. * * @param value The value validation is being performed on. * @return The parsed Integer if valid or null * if invalid. */ public Integer validate(String value) { return (Integer)parse(value, (String)null, (Locale)null); }

在校验传入的参数时,当能够解析成Integer类型就返回这个数字,如果不能就返回null

其它数值类型校验类似

Spring Validator

Spring框架提供的用于校验对象的Validator接口,在校验过程中与Errors对象配合。校验器可以通过Errors对象报告校验失败的信息

org.springframework.validation.Validator接口定义

public interface Validator {

    /**
     * Can this {@link Validator} {@link #validate(Object, Errors) validate}
     * instances of the supplied {@code clazz}?
     * 

This method is typically implemented like so: *

return Foo.class.isAssignableFrom(clazz);
* (Where {@code Foo} is the class (or superclass) of the actual * object instance that is to be {@link #validate(Object, Errors) validated}.) * @param clazz the {@link Class} that this {@link Validator} is * being asked if it can {@link #validate(Object, Errors) validate} * @return {@code true} if this {@link Validator} can indeed * {@link #validate(Object, Errors) validate} instances of the * supplied {@code clazz} */ boolean supports(Class clazz); /** * Validate the supplied {@code target} object, which must be * of a {@link Class} for which the {@link #supports(Class)} method * typically has (or would) return {@code true}. *

The supplied {@link Errors errors} instance can be used to report * any resulting validation errors. * @param target the object that is to be validated (can be {@code null}) * @param errors contextual state about the validation process (never {@code null}) * @see ValidationUtils */ void validate(Object target, Errors errors);

示例如下,可以使用POSTMAN等工具测试

package com.adagio.domain;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

public class Person {

    @NotNull
    private String name;
    
    @Min(0)
    @Max(150)
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    
}
package com.adagio.validator;

import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import com.adagio.domain.Person;

public class PersonValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Person person = Person.class.cast(target);
        
        String name = person.getName();
        if(!StringUtils.hasLength(name)){
            errors.reject("person.name.not.null", "用户名不能为空");
        }
    }

}
package com.adagio.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import com.adagio.domain.Person;

@Controller 
public class PersonController {

    @PostMapping("/person/save")
    public Person save(@Valid @RequestBody Person person){
        
        return person;
    }
}
Bean Validation 1.0(JSR-303)

常用注解:@Valid、@NotNull、@Null、@Size、@Min、@Max

也可以自定义注解及其校验规则

package com.adagio.validator;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({METHOD, FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {PersonNameConstraintValidator.class})
public @interface PersonName {

    String message() default "{person.name.not.null}";

    Class[] groups() default {};

    Class[] payload() default {};
}
package com.adagio.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PersonNameConstraintValidator implements ConstraintValidator{

    /**
     * 获取并初始化注解信息
     */
    @Override
    public void initialize(PersonName constraintAnnotation) {
        
    }

    /**
     * 设置自定义校验规则
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return false;
    }

}

person.name.not.null=人的姓名不能为空

参考:https://segmentfault.com/l/15...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67848.html

相关文章

  • Java Bean Validation

    摘要:表达式语言依赖关系提供对变量插值的支持,允许在违规消息中使用表达式。这是当相应属性的值未通过验证时通常会呈现的消息。任何违反对象中定义的约束的行为都将作为返回。案例结论本文重点介绍了标准的简单传递,并使用注释和说明了验证的基础知识。 案例概述 在这本文中,我们将介绍使用标准框架验证Java bean的基础知识 - JSR 380,也称为Bean Validation 2.0。 当然,验...

    Imfan 评论0 收藏0
  • java实现手机短信验证全过程

    摘要:下面以某个短信接口为例讲解。例如,上面的短信模板的信息应为欧阳科技登录验证码,如非本人操作,请忽略此短信。,为占位符,是你的短信验证码。验证码通知短信提交请求创建验证码验证码上面这些是主要的类,还有其他的类在文章末尾给出源代码。 手机短信验证现在在各种系统可以说都是用的非常普遍的,这个可能是方便和安全性的考虑,所以才广泛的使用,这篇文章就以一个短信接口的实例,来讲解一下怎么使用短信接口...

    whjin 评论0 收藏0
  • 图片验证码的JAVA工具类

    摘要:我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字字母甚至可能有汉字。下面我给出一个简单的工具类。验证码生成器图片的宽度。 我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字、字母、甚至可能有汉字。下面我给出一个简单的工具类。 package com..ankang.tony.util; import java.awt.Color; import java....

    SKYZACK 评论0 收藏0
  • 两步验证杀手锏:Java 接入 Google 身份验证器实战

    摘要:的身份验证器一般也是用于登录进行两步验证,和苹果的两步验证是同样的道理。只不过的身份验证器用得更多更广泛,如的两步验证都是基于身份验证器。使用我们来看下上的使用身份验证器开启两步验证的应用。 两步验证 大家应该对两步验证都熟悉吧?如苹果有自带的两步验证策略,防止用户账号密码被盗而锁定手机进行敲诈,这种例子屡见不鲜,所以苹果都建议大家开启两步验证的。 Google 的身份验证器一般也是用...

    W4n9Hu1 评论0 收藏0
  • Java中类加载机制

    摘要:类加载器类加载器执行的操作就是上述加载阶段做的事,通过一个类的全限定名来获取定义这个类的二进制字节流,类加载器可以分为下列三种。应用程序类加载器,也称为系统类加载器。 类加载流程: showImg(https://segmentfault.com/img/bV8SRP?w=1152&h=388);从上面这幅图可以看出一个类从加载到卸载有7个阶段,其中验证、准备和解析这三个步骤统称为连接...

    missonce 评论0 收藏0
  • Java 虚拟机类加载机制

    摘要:验证验证阶段的主要目的是为了确保文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。不同的虚拟机对类验证的实现可能会有所不同,但大致都会完成以下四个阶段的验证文件格式的验证元数据的验证字节码验证和符号引用验证。 原文地址 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,Thisis ...

    Dionysus_go 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<