- 浏览: 258745 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
Java validation
1. java验证器
在java开发中我们有很多场景都会对java的属性值进行验证,如web开发中表单提交数据后台数据处理中需要对传入的值进行验证,当然目前java有很多开源属性值验证框架,如hibernate validation,spring框架中也提供了相应注解验证spring validation,相比两款验证本人觉得hibernate的提供的正则数据验证比较好用,但是这些验证比较通用,很多时候也没办法完全支持我们一些特殊场景的使用,比如我想要验证某个属性的值是否存在于某个枚举类中,有些特殊值想要特殊验证处理等,基于这些场景自己不得不另起炉灶,实现一些简单的java注解验证功能。
2. java验证案例
下面通过注解构建两种简单验证方式来完成自定义验证器的简单实现,如下面要实现该数据类TestObject的验证,通过自定义注解构建验证验证策略进行验证:
自定义注解
要实现对不同注解的验证采用策略模式来实现,不同的验证实现类不同。
验证服务接口
验证实现类
运行结果为: true
1. java验证器
在java开发中我们有很多场景都会对java的属性值进行验证,如web开发中表单提交数据后台数据处理中需要对传入的值进行验证,当然目前java有很多开源属性值验证框架,如hibernate validation,spring框架中也提供了相应注解验证spring validation,相比两款验证本人觉得hibernate的提供的正则数据验证比较好用,但是这些验证比较通用,很多时候也没办法完全支持我们一些特殊场景的使用,比如我想要验证某个属性的值是否存在于某个枚举类中,有些特殊值想要特殊验证处理等,基于这些场景自己不得不另起炉灶,实现一些简单的java注解验证功能。
2. java验证案例
下面通过注解构建两种简单验证方式来完成自定义验证器的简单实现,如下面要实现该数据类TestObject的验证,通过自定义注解构建验证验证策略进行验证:
package com.annotation.validate; /** * 注解验证对象 * @author xmong */ public class TestObject { /** * 注解验证名字只能是字母下划线 */ @PatternType(pattern="^\\w*$") String name; /** * 注解验证性别值是否为性别枚举类型中的值 */ @EnumType(classType=Sex.class) String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
自定义注解
package com.annotation.validate; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 正则类型的注解 * @author xmong */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface PatternType { /** * 注解正则 * @return */ public String pattern(); /** * 注解提示信息 * @return */ public String info() default AnnotationConfig.DEFAULT_INFO; }
package com.annotation.validate; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 枚举类型注解 * @author xmong */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface EnumType { /** * 注解class类型 * @return */ @SuppressWarnings("rawtypes") public Class classType(); /** * 注解提示信息 * @return */ public String info() default AnnotationConfig.DEFAULT_INFO; }
package com.annotation.validate; /** * 枚举类 * @author xmong */ public enum Sex { MAN,WOMEN }
要实现对不同注解的验证采用策略模式来实现,不同的验证实现类不同。
package com.annotation.validate; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /** * 验证测类,不同的验证类型需要不同验证服务来完成 * @author xmong */ public class AnnotationValidationStrategy { static Map<String, AnnotationValidationService> annotationValidationServiceMap; //静态资源初始化加载 static{ init();//初始化测类 } public static void init(){ /** * 构建验证测类服务Map,根据注解类型关联相应的验证服务 */ annotationValidationServiceMap = new HashMap<String, AnnotationValidationService>(); annotationValidationServiceMap.put(EnumType.class.getSimpleName(), new AnnotationValidationEnum()); annotationValidationServiceMap.put(PatternType.class.getSimpleName(), new AnnotationValidationPattern()); } //默认验证方法 public static boolean validateAnnotation(Object obj) throws ValidateException{ return validateAnnotation(obj, false); } /** * 遍历对象属性,根据不同的注解类型调用对应的验证服务对属性值进行验证 * @param obj 验证对象 * @param flag 值为null时是否验证 * @return 验证通过返回true,反之既然 * @throws ValidateException */ public static boolean validateAnnotation(Object obj, boolean flag) throws ValidateException{ if(null == obj) return false; Field[] fields = obj.getClass().getDeclaredFields(); //遍历对象属性 for (Field field : fields) { /** * 遍历属性注解,根据注解类型名调用相应的验证服务验证该属性 */ Annotation[] annotations = field.getAnnotations(); for (Annotation annotation : annotations) { String type = annotation.annotationType().getSimpleName(); AnnotationValidationService annotationValidationService = annotationValidationServiceMap.get(type); //判断服务是否存在,不存在则抛出异常 if(null == annotationValidationService){ String msg = String.format("AnnotationValidationService '%s' is null!", type); throw new ValidateException(msg); }else if(!annotationValidationService.validate(field, obj, flag)){ return false; } } } return true; } public Map<String, AnnotationValidationService> getAnnotationValidationServiceMap() { return annotationValidationServiceMap; } }
验证服务接口
package com.annotation.validate; import java.lang.reflect.Field; /** * 验证接口 * @author xmong */ public interface AnnotationValidationService { /** * 验证接口方法 * @param field 需要验证的域 * @param obj 需要验证的 * @param flag 是特殊值标识通过位 * @return */ public boolean validate(Field field, Object obj, boolean flag) throws ValidateException; }
验证实现类
package com.annotation.validate; import java.lang.reflect.Field; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则验证 * @author xmong */ public class AnnotationValidationPattern implements AnnotationValidationService{ public boolean validate(Field field, Object obj, boolean flag)throws ValidateException { //判断该属性是否有改验证注解 if(!field.isAnnotationPresent(PatternType.class)) return false; return validateValue(field.getAnnotation(PatternType.class), field, obj, flag); } public boolean validateValue(PatternType patternType, Field field, Object obj, boolean flag) throws ValidateException{ try { //设置属性的读取值权限 field.setAccessible(true); Object object = field.get(obj); //根据标识判断属性值是否为null if(object == null && flag) return flag; //正则表达式验证属性值 Pattern pattern = Pattern.compile(patternType.pattern()); Matcher matcher = pattern.matcher(object.toString()); return matcher.matches(); } catch (IllegalArgumentException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch(Exception e){ e.printStackTrace(); throw new ValidateException(e.getMessage()); } } }
package com.annotation.validate; import java.lang.reflect.Field; /** * 枚举类型验证 * @author xmong */ public class AnnotationValidationEnum implements AnnotationValidationService{ public boolean validate(Field field, Object obj, boolean flag) throws ValidateException { if(!field.isAnnotationPresent(EnumType.class)) return false; return validateEnum(field.getAnnotation(EnumType.class), field, obj, flag); } @SuppressWarnings("unchecked") public boolean validateEnum(EnumType enumType, Field field, Object obj, boolean flag) throws ValidateException{ try { field.setAccessible(true); Object object = field.get(obj); if(object == null && flag) return flag; //验证值是否为该注解枚举类中的值 if(null == Enum.valueOf(enumType.classType(), object.toString()))return false; return true; } catch (IllegalArgumentException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch (Exception e){ e.printStackTrace(); throw new ValidateException(e.getMessage()); } } }
package com.annotation.validate; /** * @author xmong */ public class Test { public static void main(String[] args) { TestObject to = new TestObject(); to.setName("xmong"); to.setSex("MAN"); try { boolean flag = AnnotationValidationStrategy.validateAnnotation(to); System.out.println(flag); } catch (ValidateException e) { e.printStackTrace(); } } }
运行结果为: true
发表评论
-
Memo class备注类信息
2014-03-18 09:52 808Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9041. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1644Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 993Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2610Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1782Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4483Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1542Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 997Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1547Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2434Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 90581,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 1916安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3059图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2859JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3468JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1509Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1311代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2526Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
配置简单,可自由扩展验证器,实际只要实现IValidator接口,以及在rules.fo.xml中添加相关的配置即可; 支持Spring接口; 使用过程中,你会感觉好像只用了 IValidateService.validate() 一个方法,这会让人感觉良好...
本篇文章主要介绍了java validation 后台参数验证的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
使用Java实现的灵活验证库。 最新版本: 安装 Gradle是唯一受支持的构建配置。 步骤1.将JitPack存储库添加到构建文件中将其添加到存储库末尾的root build.gradle中: allprojects { repositories { maven { url...
主要介绍了JAVA中通过Hibernate-Validation进行参数验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java Bean 的验证流程如下:在实际使用中调用 Validator.validate(JavaBeanInstance) 方法后,Bean Validation 会查找在 JavaBeanInstance上所有的约束声明,对每一个约束调用对应的约束验证器进行验证,最后的结果...
graphql-java的扩展验证 该库为提供了对字段和字段参数的扩展验证 使用 < groupId>com.graphql-java</ groupId> < artifactId>graphql-java-extended-validation < version>16.0.0 < type>pom compile ' ...
java入参验证,支持实体类中对象验证,list,map 。验证是否为空,是否空字符串等等......包含所需jar包
实现 Validation.java 的缺失部分以使测试通过。 最好按照测试在每个套件中出现的顺序进行处理,并按以下顺序进行测试: 基本验证测试验证转换测试高级验证测试请密切注意 api 类型签名和注释,尤其是当您不确定...
javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP ...
CPF验证器(CPF验证器) CPF是巴西国税局保留的记录,无论年龄或国籍,任何自然人只能使用一次。 每个条目由CPF为11个十进制数字的注册号唯一标识。 个人登记簿是巴西联邦税收局维护的登记簿,任何自然人,无论...
该框架允许修改(校正)测试值。 支持验证本地化值; 允许在文本表示之间来回转换值;... 支持元数据,该元数据允许检查任何实体类型(不仅是Java Bean或POJO),还有更多。 此外,此框架还包含许多预定义的验证组件。
Struts2验证框架的配置及validation.xml常用的验证规则
spring-configuration-validation-processor.zip,验证spring@configuration类的java 6注释处理器验证spring@configuration类的java6+注释处理器
《java实用组件集》 源码 验证脚本组件 针对sample.htm做以下说明: 1、在与间加入如下代码:<script Language="JavaScript" src="ScriptLib/Validation.js"> 2、在与间添加onclick函数如页面submitButton_onclick()...
<?... namespace Respect\Validation; use ReflectionClass; use Respect\Validation\Exceptions\ComponentException;...服务器端验证就是当表单提交后,在服务器端通过JAVA,等服务器端代码对客户输入进行验证。
javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP 消息...
Fluent-validator 是一套 Java 的轻量验证框架,提供流式风格(Fluent Interface)的调用体验,类似 JDK8 stream式的 API,支持注解式验证器,支持 JSR303 -Bean Validation 标准最佳实现 Hibernate Validator 集成...
<?... /** ... ... * Licensed under The MIT License ...namespace Cake\Validation;... * Describes objects that can ...服务器端验证就是当表单提交后,在服务器端通过JAVA,等服务器端代码对客户输入进行验证。
java验证器Validator包及依赖包,亲测可用! hibernate-validator-5.1.3.Final.jar;classmate-0.8.0.jar;jboss-logging-3.2.0.Final.jar;validation-api-1.1.0.final.jar
validation验证zip,喜欢的可以下载。