国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)

這篇具有很好參考價值的文章主要介紹了身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目標

自定義一個用于校驗 身份證號碼 格式的注解@IdCard,能夠和現(xiàn)有的 Validation 參數(shù)校驗機制兼容,使用方式和其他校驗注解保持一致(使用 @Valid 注解接口參數(shù))。

本文使用原生方式實現(xiàn)校驗邏輯,校驗規(guī)則的實現(xiàn)較為基礎;Hutool工具提供了更加完善的校驗工具,可以考慮使用其來實現(xiàn)校驗邏輯。

使用 Hutool 身份證號碼格式校驗工具,實現(xiàn)校驗邏輯,參考博客如下:
《身份證號碼,格式校驗:@IdCard(Validation + Hutool)》

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗

校驗邏輯

有效格式

符合國家標準。

公民身份號碼按照GB11643-1999《公民身份號碼》國家標準編制,由18位數(shù)字組成:前6位為行政區(qū)劃代碼,第7至14位為出生日期碼,第15至17位為順序碼,第18位為校驗碼。

嚴格校驗

本文采用的校驗方式,采用嚴格校驗,第18位校驗碼,只能為數(shù)字大寫X小寫x無法通過校驗。

不校驗非空

身份證號碼注解,校驗的是格式;不校驗是否為空(null 或 空字符串)。如果身份證號碼為空,此注解校驗是可以通過的;

是否校驗非空,要根據(jù)業(yè)務邏輯來確定;如果業(yè)務邏輯需要校驗非空,則使用注解 @NotEmpty 。

核心代碼

需要定義的內容包含三個部分:

  1. 注解@IdCard
  2. 校驗器IdCardValidator
  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> {

    @Override
    public void initialize(IdCard constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }


    @Override
    public 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位,不全部為數(shù)字,為假
        if (!isDigital(idCard17)) {
            return false;
        }

        char[] c = idCard17.toCharArray();

        int[] bit = convertCharToInt(c);
        int sum17 = getPowerSum(bit);
        // 將和值與11取模得到余數(shù)進行校驗碼判斷
        String checkCode = getCheckCodeBySum(sum17);
        if (null == checkCode) {
            return false;
        }
        // 將身份證的第18位,與算出來的校碼進行匹配,不相等就為假
        return idCard18Code.equals(checkCode);
    }


    /**
     * 數(shù)字驗證
     */
    private static boolean isDigital(String str) {
        return str != null && !str.isEmpty() && str.matches("^[0-9]*$");
    }


    /**
     * 將字符數(shù)組轉為整型數(shù)組
     */
    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取模得到余數(shù)進行校驗碼判斷
     *
     * @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 {

    @Test
    void test() {
        test("110101202301024130");
        test("11010120230102857X");
        test("11010120230102857x");
        test("110101202301024130啊啊啊啊");
    }


    private void test(String idCard) {
        log.info("是否為身份證號碼格式:{} = {}", idCard, IdCardUtil.isValid(idCard));
    }

}

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗

接口測試

校驗結果為 成功

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗
身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗

校驗結果為 失敗

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗

身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯),接口參數(shù)校驗,spring boot,接口參數(shù)校驗文章來源地址http://www.zghlxwxcb.cn/news/detail-726362.html

到了這里,關于身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • java 根據(jù)身份證號碼判斷性別

    在Java中,您可以根據(jù)身份證號碼的規(guī)則來判斷性別。中國的身份證號碼通常采用的是以下規(guī)則: 第17位數(shù)字代表性別,奇數(shù)表示男性,偶數(shù)表示女性。 通常,男性的出生日期的第15、16位數(shù)字是01,女性是02。 請注意,這只是一個大致的規(guī)則,實際上,有些特殊情況下的身份

    2024年02月07日
    瀏覽(88)
  • 8.OpenCV-識別身份證號碼(Python)

    8.OpenCV-識別身份證號碼(Python)

    需求描述: 通過OpenCV識別身份證照片上的身份證號碼(僅識別身份證號碼) 實現(xiàn)思路: 1.將身份證號中的0,1,2,3,4,5,6,7,8,9作為模板,與身份證照片中的身份證號碼區(qū)域進行模板匹配。 2.先要制作一個身份證號碼模板,我這里弄了一個,基本上可以用。 ?3.識別出身份證照片身

    2024年02月11日
    瀏覽(96)
  • 根據(jù)身份證號碼判斷是否是未成年人

    ?/**** ? ? ?* 根據(jù)身份證號計算年齡 ? ? ?* @param str ? ? ? ?* @param currDate? ? ? ?* @return ? ? ?*/ ? ? public boolean calcYear(String str, Date currDate){ ? ? ? ? DateFormat dateFormat = new SimpleDateFormat(\\\"yyyyMMdd\\\"); ? ? ? ? Long year = Long.parseLong(str.substring(0,4)); ? ? ? ? Long month = Long.parseLong(st

    2023年04月23日
    瀏覽(102)
  • java從身份證號碼中提取出生年月日

    給一個String 類型的 身份證號碼,需要從這串數(shù)字中獲取出生日期、性別、年齡

    2024年02月15日
    瀏覽(89)
  • 身份證號碼的正則表達式及驗證詳解(JavaScript,Regex)

    簡言 在做用戶實名驗證時,常會用到身份證號碼的正則表達式及校驗方案。本文列舉了兩種驗證方案,大家可以根據(jù)自己的項目實際情況,選擇適合的方案 身份證號碼說明 居民身份證號碼,正確、正式的稱謂應該是“公民身份號碼”。根據(jù)【中華人民共和國國家標準 GB 11

    2023年04月20日
    瀏覽(437)
  • 身份證合法性校驗規(guī)則

    身份證合法性校驗規(guī)則

    身份證構成說明: ? 身份證號構成(從左到右): 第1-6位數(shù)是行政區(qū)域編碼 第7到第14位是出生日期 第15-17位是同一天出生的順序號(男的用奇數(shù)數(shù),女的用偶數(shù)) 第18位是校驗碼,根據(jù)ISO7064:1983.MOD11-2校驗碼算法可以驗證該身份證號是否合法身份證號。 身份證格式校驗:

    2023年04月23日
    瀏覽(30)
  • uniapp表單uni-forms校驗自定義校驗規(guī)則,手機校驗、身份證校驗

    validateFunction 自定義校驗規(guī)則 如果需要使用 validateFunction 自定義校驗規(guī)則,則 不能采用 uni-forms 的 rules 屬性來配置校驗規(guī)則,這時候需要通過ref,在 onReady 生命周期調用組件的setRules方法綁定驗證規(guī)則 無法通過props傳遞變量,是因為微信小程序會過濾掉對象中的方法,導致自定

    2024年02月11日
    瀏覽(25)
  • 前端Vue中常用rules校驗規(guī)則(輪子)如電話身份證郵箱等校驗

    目錄 前言 一、正則是什么? 二、造輪子 三、輪子使用實例 總結 例如:隨著前端的發(fā)展,很多功能都需要在前端填寫時就先校驗是否填寫正確,則博主寫了一些校驗輪子供大家使用。 正則表達式(regular expression)是一個描述字符規(guī)則的對象??梢杂脕頇z查一個字符串是否含有

    2024年02月09日
    瀏覽(29)
  • android 校驗用戶名密碼手機郵箱身份證郵編等

    android 校驗用戶名密碼手機郵箱身份證郵編等

    /** 校驗用戶名判斷:頭部尾部不能使空格,不能是中文,不能使全角,不能有星號,長度6-16 其實 中文 和 全角 的 new String(charStr.getBytes(“UTF-8”),“8859_1”).getBytes().length=6 字母、數(shù)字、特殊符號new String(charStr.getBytes(“UTF-8”),“8859_1”).getBytes().length=1 */ public static boolean val

    2024年04月25日
    瀏覽(95)
  • android 校驗用戶名密碼手機郵箱身份證郵編等(1)

    android 校驗用戶名密碼手機郵箱身份證郵編等(1)

    Pattern pattern1 = Pattern.compile(“[^u4E00-u9FA5]*”); // 不是中文 Matcher m1 = pattern1.matcher(username); if (!m1.matches()) { return false; } /** 不能有*號 */ pattern1 = Pattern.compile(“[^ ] ”); // 不是*號 m1 = pattern1.matcher(username); if (!m1.matches()) { return false; } /** 不能是純數(shù)字 */ pattern1 = Pattern.compile(“ 1

    2024年04月25日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包