当前位置: 首页 > news >正文

王者荣耀网站开发目的站长工具永久

王者荣耀网站开发目的,站长工具永久,施工企业汛期应急预案,网站网页切换怎么做的目标 自定义一个用于校验 身份证号码 格式的注解IdCard,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致(使用 Valid 注解接口参数)。 校验逻辑 有效格式 符合国家标准。 公民身份号码按照GB11643-…

目标

自定义一个用于校验 身份证号码 格式的注解@IdCard,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致(使用 @Valid 注解接口参数)。

校验逻辑

有效格式

符合国家标准。

公民身份号码按照GB11643-1999《公民身份号码》国家标准编制,由18位数字组成:前6位为行政区划代码,第7至14位为出生日期码,第15至17位为顺序码,第18位为校验码。

严格校验

本文采用的校验方式,采用严格校验,第18位校验码,只能为数字大写X小写x无法通过校验。

不校验非空

身份证号码,校验的是格式;不校验是否为空(null 或 空字符串)。如果身份证号码为空,直接通过校验;

核心代码

需要定义的内容包含三个部分:

  1. 注解@ZipCode
  2. 校验器ZipCodeValidator
  3. 校验工具类 IdCardUtil

注解:@IdCard

package com.example.core.validation.idcard;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;/*** 身份证号码。字符串必须是格式正确的身份证号码。* <p>* {@code null} 或 空字符串,是有效的(能够通过校验)。* <p>* 支持的类型:字符串** @author songguanxun* @since 1.0*/
@Target({FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = IdCardValidator.class)
public @interface IdCard {/*** @return the error message template*/String message() default "身份证号码,格式错误";/*** @return the groups the constraint belongs to*/Class<?>[] groups() default {};/*** @return the payload associated to the constraint*/Class<? extends Payload>[] payload() default {};}

校验器:IdCardValidator

package com.example.core.validation.idcard;import com.example.core.util.IdCardUtil;
import org.springframework.util.ObjectUtils;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;/*** 身份证号码,格式校验器*/
public class IdCardValidator implements ConstraintValidator<IdCard, String> {@Overridepublic void initialize(IdCard constraintAnnotation) {ConstraintValidator.super.initialize(constraintAnnotation);}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (ObjectUtils.isEmpty(value)) {return true;}return IdCardUtil.isValid(value);}}

校验工具类

package com.example.core.util;/*** 身份证号码,校验工具类*/
public class IdCardUtil {// 每位加权因子private static final int[] power = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};/*** 是格式正确的身份证号码*/public static boolean isValid(String idCard) {// null ,为假if (idCard == null) {return false;}// 非18位,为假if (idCard.length() != 18) {return false;}// 获取前17位String idCard17 = idCard.substring(0, 17);// 获取第18位String idCard18Code = idCard.substring(17, 18);// 前17位,不全部为数字,为假if (!isDigital(idCard17)) {return false;}char[] c = idCard17.toCharArray();int[] bit = convertCharToInt(c);int sum17 = getPowerSum(bit);// 将和值与11取模得到余数进行校验码判断String checkCode = getCheckCodeBySum(sum17);if (null == checkCode) {return false;}// 将身份证的第18位,与算出来的校码进行匹配,不相等就为假return idCard18Code.equals(checkCode);}/*** 数字验证*/private static boolean isDigital(String str) {return str != null && !str.isEmpty() && str.matches("^[0-9]*$");}/*** 将字符数组转为整型数组*/private static int[] convertCharToInt(char[] c) throws NumberFormatException {int[] a = new int[c.length];int k = 0;for (char temp : c) {a[k++] = Integer.parseInt(String.valueOf(temp));}return a;}/*** 将身份证的每位和对应位的加权因子相乘之后,再得到和值*/private static int getPowerSum(int[] bit) {if (power.length != bit.length) {return 0;}int sum = 0;for (int i = 0; i < bit.length; i++) {for (int j = 0; j < power.length; j++) {if (i == j) {sum = sum + bit[i] * power[j];}}}return sum;}/*** 将和值与11取模得到余数进行校验码判断** @return 校验位*/private static String getCheckCodeBySum(int sum17) {String checkCode = null;switch (sum17 % 11) {case 10:checkCode = "2";break;case 9:checkCode = "3";break;case 8:checkCode = "4";break;case 7:checkCode = "5";break;case 6:checkCode = "6";break;case 5:checkCode = "7";break;case 4:checkCode = "8";break;case 3:checkCode = "9";break;case 2:checkCode = "X";break;case 1:checkCode = "0";break;case 0:checkCode = "1";break;}return checkCode;}}

使用

@IdCard 放在需要校验格式的 身份证号码 字段上。

package com.example.web.response.model.param;import com.example.core.validation.idcard.IdCard;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;@Data
@Schema(name = "新增用户Param")
public class UserAddParam {// 其他字段@IdCard@Schema(description = "身份证号码", example = "110101202301024130")private String idCard;}

校验效果

校验工具类,单元测试

package com.example;import com.example.core.util.IdCardUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;@Slf4j
public class IdCardTest {@Testvoid test() {test("110101202301024130");test("11010120230102857X");test("11010120230102857x");test("110101202301024130啊啊啊啊");}private void test(String idCard) {log.info("是否为身份证号码格式:{} = {}", idCard, IdCardUtil.isValid(idCard));}}

在这里插入图片描述

接口测试

校验结果为 成功

在这里插入图片描述
在这里插入图片描述

校验结果为 失败

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

http://www.shuangfujiaoyu.com/news/57083.html

相关文章:

  • 用java做网站步骤怎么搜索关键词
  • 日本真人做爰直播网站温州seo优化
  • b2b网站栏目北京学电脑的培训机构
  • 深圳华强北网站建设磁力王
  • crm免费客户管理系统焦作seo公司
  • 深圳市富通建设工程有限公司网站网站信息查询
  • 旅游网站建设的相关报价本网站三天换一次域名
  • 做暧在线观看网站申请网址怎么申请的
  • 整形医院网站建设软文网站名称
  • 12306网站开发过程互联网公司
  • 网站开发实训总结网络营销模式
  • 软件项目设计方案seo网站优化外包
  • 花钱制作网站有什么好处公众号推广平台
  • 网站首页代码在哪里推广关键词优化
  • dede手机网站模版百度安装应用
  • 赚钱的网站平台网络推广app是干什么的
  • 南京地区网站开发汕头seo建站
  • 郑州网站制作公司怎么样南宁百度关键词推广
  • 南京网站设计课程扶贫832网络销售平台
  • 网站怎么做能中英文的我们公司想做网络推广
  • 昆明网站建设方案优化seo公司怎么推广宣传
  • 嘉兴制作手机网站搜索网络如何制造
  • wordpress短信通知下载优化大师安装桌面
  • python做简单的网站百度推广官方电话
  • 青岛做公司网站sem是什么设备
  • 妇科网站源码模板建站价格
  • 公司建设网站需要固定ip吗淘宝关键词搜索排名
  • 女性门户网站源码两性网站模版女性门户网站整站源码带数据带采集漳州seo网站快速排名
  • 建一个网站买完域名后应该怎么做免费的域名和网站
  • 平台网站如何优化淘宝seo 优化软件