最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot實現(xiàn)調(diào)用百度ocr實現(xiàn)身份識別+二要素校驗功能

 更新時間:2025年03月22日 10:18:32   作者:似璟如你  
本文介紹了如何使用Spring Boot調(diào)用百度OCR服務(wù)進行身份識別,并通過二要素校驗確保信息準確性,感興趣的朋友一起看看吧

一、技術(shù)選型

OCR服務(wù):推薦使用百度AI

二、實現(xiàn)

1.注冊一個服務(wù)

百度智能云控制臺

https://console.bce.baidu.com/ai-engine/ocr/overview/index?_=1742309417611

填寫完之后可以獲取到app-id、apiKey、SecretKey這三個后面文件配置會用到

2、導(dǎo)入依賴

        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.13</version>
        </dependency>
        <!-- 百度AI SDK(示例) -->
        <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.16.13</version>
        </dependency>
        <!--json依賴-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.40</version>
        </dependency>

3、配置文件

spring:
  servlet:
    multipart:
      max-request-size: 10MB # 文件上傳最大值
      max-file-size: 10MB # 單個文件最大值
baidu:
  ai:
    app-id: ***** 換成自己的
    secret-key: ***** 換成自己的
    api-key: ***** 換成自己的

4、編寫OCR工具類

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@Component
public class OcrService {
    @Value("${baidu.ai.app-id}")
    private String appId;
    @Value("${baidu.ai.api-key}")
    private String apiKey;
    @Value("${baidu.ai.secret-key}")
    private String secretKey;
    public Map<String, String> recognizeIdCard(MultipartFile file, boolean isFront) throws Exception {
        AipOcr client = new AipOcr(appId, apiKey, secretKey);
        // 讀取圖片字節(jié)
        byte[] imgData = file.getBytes();
        // 設(shè)置身份證正反面
        String idCardSide = isFront ? "front" : "back";
        // 設(shè)置其他識別選項(如果有)
        HashMap<String, String> options = new HashMap<String, String>();
        // 可以在這里添加其他選項,例如:
        // options.put("detect_direction", "true"); // 檢測圖像朝向
        // 調(diào)用身份證識別接口
        JSONObject res = client.idcard(imgData, idCardSide, options);
        // 檢查返回結(jié)果
        if (res == null || !res.has("words_result")) {
            throw new Exception("OCR 識別失敗: 返回結(jié)果為空或不包含 words_result");
        }
        // 解析結(jié)果
        Map<String, String> result = new HashMap<String, String>();
        JSONObject words = res.getJSONObject("words_result");
        // 根據(jù)正反面提取不同字段
        if (isFront) {
            result.put("姓名", words.optString("姓名", ""));
            result.put("性別", words.optString("性別", ""));
            result.put("民族", words.optString("民族", ""));
            result.put("出生日期", words.optString("出生年月日", ""));
            result.put("住址", words.optString("住址", ""));
            result.put("身份證號", words.optString("公民身份號碼", ""));
        } else {
            result.put("簽發(fā)機關(guān)", words.optString("簽發(fā)機關(guān)", ""));
            result.put("有效期限", words.optString("失效日期", ""));
        }
        return result;
    }
}

5、文件上傳接口

import com.alibaba.fastjson.JSON;
import com.cykj.service.OcrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/idcard")
/**
 * 身份證識別控制器
 * 提供身份證圖片上傳和識別功能
 */
public class IdCardController {
    @Autowired
    private OcrService ocrService;
    /**
     * 上傳身份證圖片并進行識別
     * 
     * @param frontFile 身份證正面圖片
     * @param backFile 身份證反面圖片
     * @return 身份證信息的Map,包括正面和反面的識別結(jié)果
     */
    @PostMapping("/upload")
    public ResponseEntity<?> uploadIdCard(
            @RequestParam("frontFile") MultipartFile frontFile,
            @RequestParam("backFile") MultipartFile backFile) {
        System.out.println(frontFile);
        System.out.println(backFile);
        try {
            // 識別正面信息
            Map<String, String> frontInfo = ocrService.recognizeIdCard(frontFile, true);
            System.out.println("Front Info: " + frontInfo);
            // 識別反面信息
            Map<String, String> backInfo = ocrService.recognizeIdCard(backFile, false);
            System.out.println("Back Info: " + backInfo);
            // 合并結(jié)果
            Map<String, String> combined = new HashMap<String, String>();
            combined.putAll(frontInfo);
            combined.putAll(backInfo);
            // 身份證校驗(示例)
            String idNumberJson = combined.get("身份證號");
            //解析獲取身份證號
            com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(idNumberJson);
            String idNumber = jsonObject.getString("words");
            if (!validateIdCard(idNumber)) {
                return ResponseEntity.badRequest().body("身份證號校驗失敗");
            }
            return ResponseEntity.ok(combined);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(500).body("識別失敗: " + e.getMessage());
        }
    }
    /**
     * 簡單身份證號校驗(正則表達式)
     * 
     * @param idNumber 身份證號碼字符串
     * @return 校驗通過返回true,否則返回false
     */
    private boolean validateIdCard(String idNumber) {
        String regex = "^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$";
        return idNumber != null && idNumber.matches(regex);
    }
}

三、前端寫個測試頁面

這邊的action路徑要改成自己的路徑

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8086/api/idcard/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="frontFile" accept="image/*" required>
    <input type="file" name="backFile" accept="image/*" required>
    <button type="submit">上傳并識別</button>
</form>
</body>
</html>

第一張為身份證正面(人)

第二張上傳為身份證反面(國徽那面)

測試成功在頁面和控制臺都可以看見自己提取出來的信息就成功啦!

四、二要素校驗

身份證上傳也不能保證信息準確,畢竟還可以進行p圖技術(shù)進行修改嘛

為了保證信息的正確,就得要引入二要素校驗==》對姓名和身份證號碼進行校驗

(1)配置

https://www.apispace.com/explore/service

打開網(wǎng)址

首次購買有20次的免費使用!??! ,購買完如下~

往下滑可以看見主要的代碼

(2)代碼實現(xiàn)

/**
     * 二要素校驗
     * @param idNumber 身份證
     * @param realname 姓名
     * @return true則為一致,匹配正確
     * @throws IOException
     */
    private boolean validateIdCardAndName(String idNumber, String realname) throws IOException {
        // 示例:判斷身份證號和姓名是否匹配
        OkHttpClient client = new OkHttpClient();
        //校驗身份和姓名是否匹配 ==》二要素校驗
        RequestBody body = RequestBody.create(okhttp3.MediaType.get("application/x-www-form-urlencoded"),
                "realname=" + realname + "&idcard=" + idNumber
        );
        //下面的addHeader和url都可以在上面購買完可以看見信息
        Request request = new Request.Builder()
                .url("換成自己的!?。。。。。。。?!")
                .method("POST", body)
                .addHeader("X-APISpace-Token", "換成自己的?。。。。。。。。?!")
                .build(); // 移除重復(fù)的 Content-Type 頭
        Response response = client.newCall(request).execute();
        //System.out.println(response.body().string());
        //打印出來的{"requestId":"f20067dac6633685bd348f9e388b","data":{"valid":false,"incorrect":101,"message":"不一致"},"code":0,"message":"success"}
        if (response.code() != 200) {
            return false;
        }
        if (response.body() == null) {
            return false;
        }
        try {
            JSONObject responseJson = JSON.parseObject(response.body().string());
            if (responseJson.containsKey("data") && responseJson.getJSONObject("data").containsKey("message")) {
                JSONObject dataJson = responseJson.getJSONObject("data");
                String dataMessage = dataJson.getString("message");
                return "一致".equals(dataMessage);
            } else {
                System.out.println("響應(yīng)缺少必要字段");
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

// 獲取姓名
            String nameInfo = combined.get("姓名");
            JSONObject nameJson = JSON.parseObject(nameInfo);
            String realname = nameJson.getString("words");
            //校驗姓名和身份證是否匹配
            boolean validateIdCardAndName = validateIdCardAndName(idNumber, realname);
            if (!validateIdCardAndName){
                //說明當前身份證于當前姓名不匹配
                return ResponseEntity.badRequest().body("姓名和身份不匹配,請檢查填寫信息是否正確");
            }

到此這篇關(guān)于springboot實現(xiàn)調(diào)用百度ocr實現(xiàn)身份識別+二要素校驗的文章就介紹到這了,更多相關(guān)springboot身份識別+二要素校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的ConcurrentHashMap中不能存儲null的原因解析

    Java的ConcurrentHashMap中不能存儲null的原因解析

    眾所周知,在Java中Map可以存儲null,而ConcurrentHashMap不能存儲null值,那么為什么呢?今天通過源碼分析給大家詳細解讀,感興趣的朋友一起看看吧
    2022-07-07
  • Mac開源開發(fā)環(huán)境搭建指南之一次配好Git、JDK、Maven、Docker

    Mac開源開發(fā)環(huán)境搭建指南之一次配好Git、JDK、Maven、Docker

    mac開發(fā)環(huán)境配置的核心在于構(gòu)建高效、隔離且可復(fù)用的工程化體系,而非單純安裝軟件,這篇文章主要介紹了Mac開源開發(fā)環(huán)境搭建指南之一次配好Git、JDK、Maven、Docker的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • SpringBoot集成Swagger2生成接口文檔的方法示例

    SpringBoot集成Swagger2生成接口文檔的方法示例

    我們提供Restful接口的時候,API文檔是尤為的重要,它承載著對接口的定義,描述等,本文主要介紹了SpringBoot集成Swagger2生成接口文檔的方法示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Spring?Boot全局異常處理實戰(zhàn)指南

    Spring?Boot全局異常處理實戰(zhàn)指南

    在開發(fā)過程中,異常是不可避免的,Spring?Boot提供了一種簡單而強大的機制來處理應(yīng)用程序中的異常,即全局異常處理,這篇文章主要介紹了Spring?Boot全局異常處理的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • Java 內(nèi)部類的定義與范例

    Java 內(nèi)部類的定義與范例

    說起內(nèi)部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫代碼時可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2021-11-11
  • 基于SpringBoot+Vue實現(xiàn)DeepSeek對話效果的詳細步驟

    基于SpringBoot+Vue實現(xiàn)DeepSeek對話效果的詳細步驟

    本文詳細介紹了使用SpringBoot和Vue構(gòu)建對話系統(tǒng),包含API設(shè)計、聊天界面開發(fā)、前后端集成及WebSocket優(yōu)化,實現(xiàn)類似DeepSeek的交互效果,需要的朋友可以參考下
    2025-07-07
  • Spring-DI依賴注入全過程

    Spring-DI依賴注入全過程

    Spring DI是核心特性,通過容器管理依賴注入,降低耦合度,實現(xiàn)方式包括組件掃描、構(gòu)造器/設(shè)值/字段注入、自動裝配及作用域配置,支持靈活的依賴管理與生命周期控制,提升代碼可維護性與可測試性
    2025-08-08
  • java解析xml匯總_動力節(jié)點Java學(xué)院整理

    java解析xml匯總_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了java解析xml匯總_動力節(jié)點Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • spring?boot常見get?、post請求參數(shù)處理、參數(shù)注解校驗、參數(shù)自定義注解校驗問題解析

    spring?boot常見get?、post請求參數(shù)處理、參數(shù)注解校驗、參數(shù)自定義注解校驗問題解析

    這篇文章主要介紹了spring?boot常見get?、post請求參數(shù)處理、參數(shù)注解校驗、參數(shù)自定義注解校驗,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • SpringBoot3應(yīng)用中集成和使用Spring Retry的實踐記錄

    SpringBoot3應(yīng)用中集成和使用Spring Retry的實踐記錄

    SpringRetry為SpringBoot3提供重試機制,支持注解和編程式兩種方式,可配置重試策略與監(jiān)聽器,適用于臨時性故障場景,需合理設(shè)置次數(shù)、退避策略并做好監(jiān)控,本文給大家詳細介紹如何在 SpringBoot 3 應(yīng)用中集成和使用 Spring Retry,感興趣的朋友一起看看吧
    2025-06-06

最新評論

吴旗县| 庆城县| 嘉鱼县| 凤台县| 青铜峡市| 遵化市| 志丹县| 筠连县| 长海县| 贡觉县| 涿州市| 禹城市| 深圳市| 上思县| 德江县| 米易县| 宜兰县| 湟中县| 西安市| 莎车县| 天水市| 玉门市| 平塘县| 镇原县| 铜陵市| 措勤县| 团风县| 兴和县| 汉中市| 二连浩特市| 南康市| 穆棱市| 建水县| 兖州市| 曲周县| 衡南县| 精河县| 安化县| 庆阳市| 尚义县| 平山县|