定义一个注解@Ident 实现注解方法IdentValidated

/*** 身份证号码验证*/
@Constraint(validatedBy = { IdentValidated.class })
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
public @interface Ident {String message() default "请输入有效身份证号码";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };/*** Defines several {@code @NotBlank} constraints on the same element.** @see NotBlank*/@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })@Retention(RUNTIME)@Documentedpublic @interface List {NotBlank[] value();}
}

实现注解方法

@Slf4j
public class IdentValidated implements ConstraintValidator<Ident,String> {Map<String,String> map=new HashMap<String,String>(){{put("11","北京");put("12","天津");put("13","河北");put("14","山西");put("15","内蒙古");put("21","辽宁");put("22","吉林");put("23","黑龙江");put("31","上海");put("32","江苏");put("33","浙江");put("34","安徽");put("35","福建");put("36","江西");put("37","山东");put("41","河南");put("42","湖北");put("43","湖南");put("44","广东");put("45","广西");put("46","海南");put("50","重庆");put("51","四川");put("52","贵州");put("53","云南");put("54","西藏");put("61","陕西");put("62","甘肃");put("63","青海");put("64","宁夏");put("65","新疆");put("71","台湾");put("81","香港");put("82","澳门");}};@Overridepublic void initialize(Ident constraintAnnotation) {}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {log.info("value:{}",value);if(StringUtils.isEmpty(value)){return false;}/*** 身份证格式不正确* 身份证号码正则检查* 检查不通过直接返回false*/if(!value.matches(Validation.IDEN_NO_REG)) {return false;}/*** 身份证前两位校验*/String s = value.substring(0, 2);String s1 = map.get(s);if(s1==null){return false;}/*** 出生日期校验*//*String bearth="/^(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/";if(!value.substring(6,14).matches(bearth)) {return false;}*/return identValid(value);}/*** 根据身份证主体码(前17位)分别与对应的加权因子(表1)计算乘积再求和,根据所得结果与11取模得到X值。*  根据 X 值查询表2,得出a18即校验码值* @param val* @return*/private Boolean identValid(String val) {// String sid="/^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$/";Integer[] factor = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };String[] parity = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};String code = val.substring(0, 17);String[] split = code.split("");Integer sum = 0;for (int i = 0; i < split.length; i++) {sum+=Integer.parseInt(split[i])*factor[i];}return val.endsWith(parity[sum % 11]);}}

具体使用参照@Validated 注解用法
注意 使用对象嵌套形式需要使用 @Valid加在父级属性上

Springboot 自定义身份证验证注解相关推荐

  1. e0312 不存在用户定义的_更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  2. SpringBoot自定义参数验证器

    前要 之前我们介绍了JSR-303验证方式,十分的方便Spring都帮我们封装好了,但是对一些复杂的验证,还是需要更加灵活的验证器的. JSR-303验证器传送门:https://www.jiansh ...

  3. 自定义hibernate validation注解

    效果和优点 先看最后效果: public class UserEntity {@Password private String password;@Emailprivate String email; ...

  4. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...

  5. Springboot自定义注解进行数据唯一性验证

    一.添加自定义注解 /*** 自定义注解--字段验证** @author zhuzhibin* @date 2023/5/16 14:25**/ @Target({ElementType.TYPE}) ...

  6. SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证

    作者:超级小豆丁 http://www.mydlq.club/article/49/ 目录 一.为什么使用 @Valid 来验证参数 二.@Valid 注解的作用 三.@Valid 的相关注解 四.使 ...

  7. Springboot自定义注解实现用户登录状态校验(一)

    Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...

  8. springboot 自定义注解拦截器

    springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...

  9. @retention注解作用_分分钟带你玩转SpringBoot自定义注解

    在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...

最新文章

  1. Docker Desktop添加对Kubernetes的支持
  2. mysql 源代码学习 博客 [lock..]
  3. bootstrap3中模态框的数据编辑使用方法
  4. Python入门 推导式 ! 解释:生成器表达式和列表推导式的区别
  5. 2021云上架构与运维峰会12月10日线上开启,五大精彩看点不容错过
  6. C#ListBox对Item进行重绘,包括颜色
  7. [Linux]Centos 6.3 下源代码安装gcc 4.8.2/4.9.2
  8. 本土链雷达网_走向本土设计
  9. qos的_QoS 概述
  10. Telerik RadGridView 右键菜单如何设置?
  11. Selenium 生成HTML的测试报告
  12. DELPHI中完成端口(IOCP)的简单分析(1)
  13. Linux 4.21优化Zen 2架构
  14. Win11硬盘安装方法介绍 Win11系统硬盘安装教程
  15. lls 在* 80端口已经绑定的情况下,批量加域名到*80端口
  16. c3 linearization详解
  17. 用Boost::spirit库写C++的源代码解析器(一) 一个简单的例子:解析enum的解析器雏形
  18. POS Tagging 和Chunking (学习笔记)
  19. keil uvision5 cannot write project file 和 cannot read project file 解决建议
  20. 设计模式—策略模式的设计与使用

热门文章

  1. word如何一键全选_word文档怎么全选所有内容
  2. 如何安装KEIL MDK5开发软件
  3. JQData提供哪些数据
  4. elevation格式_Google Elevation的工作方式以及如何创建简单的C#应用​​程序?
  5. 深入理解Java注解(二)——JavaPoet使用
  6. UVM-config机制
  7. 普及下病毒性感冒和细菌性感冒的区别(如何看血常规)
  8. 在Ubuntu16.04.1上安装、配置、使用Nginx
  9. 【你好Resilience4j】一:Resilience4j之初体验
  10. 移动硬盘的“磁盘结构损坏且无法读取”问题的解决方法