现在开发项目中数据的安全验证已是必不可少的一部分,若是只是让前段作验证,并不能保证整个系统的安全。故在介绍一款很是好用的后端验证数据有效性的框架:oval
oval已经内置支持字段非空,数据长度,数据范围,正则匹配等验证,同时还能够在此框架的基础上实现自定义的验证。此次我就介绍一下经常使用的数据是否在数据库重复的验证。
依赖:数据库
<dependency> <groupId>net.sf.oval</groupId> <artifactId>oval</artifactId> <version>1.90</version> </dependency>
在此我定义一个User的实体类,其简单的验证代码以下:后端
public class User { @NotNull(message = "username can not be null",profiles = "username") @Length(min = 8,max = 20,message = "username length error.",profiles = "username") @MatchPattern(pattern = "(\\w+)",message = "username have special characters.",profiles = "username") private String username; private String password; }
profiles 表示给该字段定义一个标签,为对象字段的选择性验证而存在。api
上面的列子只是oval自带的一些验证,固然这里也没有列举彻底,若是有兴趣能够去查询其api.基本能够知足大部分项目需求。但若是须要定义一些特殊的验证规则这须要咱们本身实现一部分代码。我这里举一个数据库的字段名是否重复的验证代码示例。安全
注解类:app
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Constraint(checkWith = UniqueCheck.class) public @interface Unique { ConstraintTarget[] appliesTo() default {ConstraintTarget.VALUES}; String errorCode() default "unique error"; String message() default "field duplicate"; String[] profiles() default {}; int severity() default 0; String target() default ""; String when() default ""; String field(); String tablename(); @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Constraints public @interface List { net.sf.oval.constraint.Length[] value(); String when() default ""; } }
数据库验重:框架
public class UniqueCheck extends AbstractAnnotationCheck<Unique> { private String field; private String tablename; private String message; public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context, Validator validator) throws OValException { if (validatedObject == null) return true; String value = valueToValidate.toString(); /** * 在此处将表名,字段,值作数据库操做 * * if exist ,return false */ return true; } @Override protected Map<String, String> createMessageVariables() { Map<String, String> re = Validator.getCollectionFactory().createMap(2); re.put("message", this.message); return re; } @Override public void configure(Unique unique) { super.configure(unique); field = unique.field(); tablename = unique.tablename(); message = unique.message(); } }
至此,你只须要在username上面加上以下注解便可支持字段惟一性验证:ide
@Unique(field="username",tablename="tb_user",profiles="username",message="数据库已存在")
public static void main(String[] args) { User user = new User("zhangsna"); MyValidator.validator(person, "username"); } static class MyValidator { public static <T> void validator(T t, String... profiles) { Validator v = new Validator(); List<ConstraintViolation> message = v.validate(t, profiles); for (ConstraintViolation var : message) { System.out.println(var.getMessage()); } } }