偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

確保數(shù)據(jù)安全!使用Spring Boot 實(shí)現(xiàn)強(qiáng)大的API參數(shù)驗(yàn)證

開發(fā) 前端
在 Spring Boot 項(xiàng)目中,可以通過在 messages.properties 文件中定義異常提示文本,并在代碼中通過 @Message 注解引用這些文本來實(shí)現(xiàn)國(guó)際化和自定義錯(cuò)誤消息。

我們?cè)陧?xiàng)目開發(fā)中,出于對(duì)數(shù)據(jù)完整性的考慮,基本上每個(gè)接口都需要參數(shù)校驗(yàn),參數(shù)校驗(yàn)可以自己手動(dòng)校驗(yàn),也可以用工具校驗(yàn),今天松哥和大家分享如何利用 Spring Boot 自帶的工具實(shí)現(xiàn)參數(shù)校驗(yàn)。

一 前端 or 后端?

參數(shù)校驗(yàn)應(yīng)該在前端完成還是后端完成?

正常來說,前后端都是需要校驗(yàn)的,但是前后端校驗(yàn)的目的各不相同。

一般來說,前端校驗(yàn)可以滿足兩個(gè)需求:

  1. 用戶體驗(yàn):前端校驗(yàn)可以即時(shí)反饋給用戶,減少等待服務(wù)器響應(yīng)的時(shí)間,提高用戶體驗(yàn)。
  2. 減輕服務(wù)器負(fù)擔(dān):通過前端校驗(yàn)可以過濾掉一些明顯無效的請(qǐng)求,減少不必要的服務(wù)器負(fù)載。

真正要確保數(shù)據(jù)完整性,還得要靠后端,后端校驗(yàn)可以起到如下作用:

  1. 安全性:由于前端代碼可以被繞過或修改。后端校驗(yàn)是安全的必要保障,確保即使前端校驗(yàn)被繞過,數(shù)據(jù)的安全性和完整性也能得到保證。
  2. 數(shù)據(jù)一致性:后端校驗(yàn)可以確保所有通過的請(qǐng)求都符合業(yè)務(wù)邏輯和數(shù)據(jù)模型的要求,保持?jǐn)?shù)據(jù)的一致性。
  3. 容錯(cuò)性:后端校驗(yàn)可以處理那些前端未能覆蓋到的異常情況,作為最后一道防線。
  4. 跨平臺(tái)一致性:后端校驗(yàn)確保了無論用戶通過何種客戶端(Web、移動(dòng)應(yīng)用、第三方 API 等)訪問服務(wù),數(shù)據(jù)校驗(yàn)的標(biāo)準(zhǔn)都是一致的。
  5. 維護(hù)和可擴(kuò)展性:后端校驗(yàn)邏輯通常更容易維護(hù)和更新,因?yàn)樗鼈兗性诜?wù)器端,而不是分散在多個(gè)客戶端。
  6. 日志和監(jiān)控:后端可以記錄校驗(yàn)失敗的請(qǐng)求,這對(duì)于監(jiān)控系統(tǒng)安全和進(jìn)行問題診斷非常有用。

因此,后端校驗(yàn)才能真正確保數(shù)據(jù)的完整性,今天松哥也是要和大家聊一聊后端數(shù)據(jù)校驗(yàn)。

二 參數(shù)校驗(yàn)注解

2.1 參數(shù)校驗(yàn)依據(jù)

在 Spring Boot 中,數(shù)據(jù)校驗(yàn)是通過 JSR303/JSR380 規(guī)范的 Bean Validation 實(shí)現(xiàn)的。

這里涉及到兩個(gè)概念,松哥和大家簡(jiǎn)單說下。

JSR303 是 Bean Validation 的 1.0 版本,正式名稱為《Bean Validation》。它提供了一套注解和 API 來定義 Java 對(duì)象(Bean)的驗(yàn)證規(guī)則。這些注解可以直接用于 Bean 的屬性上,以聲明式的方式定義驗(yàn)證邏輯。JSR303 定義了一組標(biāo)準(zhǔn)的驗(yàn)證注解,如 @NotNull、@Size、@Email 等,用于校驗(yàn)對(duì)象的屬性是否滿足特定的條件。

而 JSR380 則是 Bean Validation 的 2.0 版本,也稱為《Jakarta Bean Validation 2.0》。隨著 JavaEE 向 JakartaEE 的遷移,JSR380 成為了新的規(guī)范。JSR380 在 JSR303 的基礎(chǔ)上進(jìn)行了擴(kuò)展和改進(jìn),增加了新的注解、改進(jìn)了 API,并提供了更好的集成方式。JSR380 的注解與 JSR303 兼容,但增加了一些新的注解,如 @Email 的 message 屬性支持國(guó)際化,以及 @PositiveOrZero、@NegativeOrZero 等。

松哥下面案例主要和小伙伴們分享最新的 JSR380 規(guī)范中的參數(shù)校驗(yàn)注解。

2.2 代碼實(shí)踐

現(xiàn)在我們創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,使用當(dāng)前最新版,并且引入?yún)?shù)校驗(yàn)依賴,最終創(chuàng)建好的工程依賴如下:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

假設(shè)我現(xiàn)在有一個(gè) UserDto 類,需要進(jìn)行參數(shù)校驗(yàn),那么我可以按照如下方式定義 UserDto:

/**
 * @author:江南一點(diǎn)雨
 * @site:http://www.javaboy.org
 * @微信公眾號(hào):江南一點(diǎn)雨
 * @github:https://github.com/lenve
 * @gitee:https://gitee.com/lenve
 */
public class UserDto {
    @NotNull(message = "用戶名不能為空")
    private String username;
    @NotBlank(message = "密碼不能為空")
    private String password;
    @NotEmpty(message = "郵箱不能為空")
    private String email;
    //省略 getter/setter


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

接下來在 Controller 的方法參數(shù)前使用 @Validated 注解來開啟校驗(yàn)。

/**
 * @author:江南一點(diǎn)雨
 * @site:http://www.javaboy.org
 * @微信公眾號(hào):江南一點(diǎn)雨
 * @github:https://github.com/lenve
 * @gitee:https://gitee.com/lenve
 */
@RestController
public class UserController {
    @GetMapping("/hello")
    public String hello(@Validated UserDto userDto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // 處理校驗(yàn)失敗情況
        }
        return "200";
    }
}

當(dāng)參數(shù)校驗(yàn)失敗時(shí),會(huì)拋出 MethodArgumentNotValidException 異常??梢栽谌之惓L幚砥髦胁东@該異常并進(jìn)行統(tǒng)一處理。

/**
 * @author:江南一點(diǎn)雨
 * @site:http://www.javaboy.org
 * @微信公眾號(hào):江南一點(diǎn)雨
 * @github:https://github.com/lenve
 * @gitee:https://gitee.com/lenve
 */
@RestControllerAdvice
public class GlobalException {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String handleValidationExceptions(MethodArgumentNotValidException ex) {
        // 獲取校驗(yàn)結(jié)果的錯(cuò)誤信息
        String message = ex.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        return message;
    }
}

如此就大功告成了~是不是非常 Easy?

2.3 異常提示優(yōu)化

上面參數(shù)校驗(yàn)注解中的異常提示都是在 Java 代碼里邊硬編碼的,我們也可以提前定義好異常提示文本,然后在代碼里引用即可,這樣更加方便,也好維護(hù)。

在 Spring Boot 項(xiàng)目中,可以通過在 messages.properties 文件中定義異常提示文本,并在代碼中通過 @Message 注解引用這些文本來實(shí)現(xiàn)國(guó)際化和自定義錯(cuò)誤消息。

具體步驟是這樣的:

  1. 創(chuàng)建 messages.properties 文件:在 src/main/resources 目錄下創(chuàng)建一個(gè) messages.properties 文件(對(duì)于不同語言版本,可以創(chuàng)建如 messages_en.properties、messages_fr.properties 等文件)。
  2. 定義異常提示文本:在 messages.properties 文件中定義鍵值對(duì),鍵用于在代碼中引用,值是實(shí)際的錯(cuò)誤消息。
NotEmpty.username=用戶名不能為空
NotBlank.password=密碼不能為空
Email.email=郵箱格式不正確
  1. 在實(shí)體類或 DTO 上使用校驗(yàn)注解。
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;

public class UserDto {
    @NotNull(message = "{NotEmpty.username}")
    private String username;
    
    @NotBlank(message = "{NotBlank.password}")
    private String password;
    
    @Email(message = "{Email.email}")
    private String email;

    // Getters and setters
}
  1. 配置國(guó)際化:如果你的應(yīng)用需要支持多語言,可以在 application.properties 或 application.yml 中配置消息源。
spring.messages.basename=messages
spring.messages.encoding=UTF-8

這樣,當(dāng)校驗(yàn)失敗時(shí),Spring 將自動(dòng)從 messages.properties 文件中查找對(duì)應(yīng)的錯(cuò)誤消息,并將其返回給客戶端。這種方法不僅可以使錯(cuò)誤消息更加靈活和可維護(hù),還可以方便地實(shí)現(xiàn)國(guó)際化。

三 什么是分組校驗(yàn)

為什么需要分組校驗(yàn)?zāi)兀?/p>

假設(shè)我們有一個(gè)用戶實(shí)體 User,它包含用戶名、密碼和郵箱三個(gè)字段。在用戶注冊(cè)時(shí),我們需要校驗(yàn)用戶名和密碼非空,郵箱格式正確。但在用戶信息更新時(shí),我們只需要校驗(yàn)用戶名和郵箱,密碼可能不會(huì)被修改,因此不需要校驗(yàn)。對(duì)于這種需求,我們可以使用分組校驗(yàn)來實(shí)現(xiàn)這一需求。

松哥通過一個(gè)具體的案例來和小伙伴們演示下。

首先,我們定義兩個(gè)校驗(yàn)分組,一個(gè)用于注冊(cè),一個(gè)用于更新:

public interface RegisterGroup {}
public interface UpdateGroup {}

分組其實(shí)就是兩個(gè)空接口,用來做標(biāo)記用。

然后,我們?cè)?User 實(shí)體上應(yīng)用這些分組:

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class User {
    @NotBlank(message = "用戶名不能為空", groups = {RegisterGroup.class, UpdateGroup.class})
    private String username;

    @NotBlank(message = "密碼不能為空", groups = RegisterGroup.class)
    private String password;

    @Email(message = "郵箱格式不正確", groups = {RegisterGroup.class, UpdateGroup.class})
    private String email;

    // Getters and setters
}

上面代碼中,username 和 email 即屬于注冊(cè)分組也屬于更新分組,而 password 則只屬于注冊(cè)分組。

接下來,在注冊(cè)接口中,我們使用 @Validated 注解并指定 RegisterGroup 分組:

/**
 * @author:江南一點(diǎn)雨
 * @site:http://www.javaboy.org
 * @微信公眾號(hào):江南一點(diǎn)雨
 * @github:https://github.com/lenve
 * @gitee:https://gitee.com/lenve
 */
@RestController
public class UserController {
    @GetMapping("/hello")
    public String hello(@Validated UserDto userDto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // 處理校驗(yàn)失敗情況
        }
        return "200";
    }

    @PostMapping("/register")
    public String register(@Validated(RegisterGroup.class) @RequestBody UserDto user) {
        // 注冊(cè)邏輯
        return "注冊(cè)成功";
    }

    @PostMapping("/update")
    public String update(@Validated(UpdateGroup.class) @RequestBody UserDto user) {
        // 更新邏輯
        return "更新成功";
    }
}

在這個(gè)例子中,當(dāng)調(diào)用注冊(cè)接口時(shí),User 對(duì)象會(huì)根據(jù) RegisterGroup 分組進(jìn)行校驗(yàn),而調(diào)用更新接口時(shí),則會(huì)根據(jù) UpdateGroup 分組進(jìn)行校驗(yàn)。這樣,我們就可以根據(jù)不同的業(yè)務(wù)需求來應(yīng)用不同的校驗(yàn)規(guī)則了。

分組校驗(yàn)這種方式提供了一種靈活的方式來應(yīng)對(duì)不同的校驗(yàn)場(chǎng)景,使得我們的代碼更加清晰和易于維護(hù)。

責(zé)任編輯:武曉燕 來源: 江南一點(diǎn)雨
相關(guān)推薦

2014-03-25 10:09:46

2022-08-26 15:28:52

網(wǎng)絡(luò)安全黑客IT

2023-05-11 12:40:00

Spring控制器HTTP

2013-05-15 09:31:17

2025-06-06 08:28:56

2025-03-13 10:14:44

2021-08-12 10:32:50

Spring Boot參數(shù)校驗(yàn)分組校驗(yàn)

2021-08-10 15:11:27

Spring Boot參數(shù)校驗(yàn)

2025-07-04 04:22:00

數(shù)據(jù)安全零信任

2024-03-14 12:00:52

2024-04-22 09:02:06

LicenseC#軟件開發(fā)RSA加密

2024-06-13 08:41:41

2021-12-28 11:13:05

安全認(rèn)證 Spring Boot

2024-07-05 11:22:39

2024-05-30 08:51:28

Spring數(shù)據(jù)分布式

2023-09-27 08:14:56

2024-08-30 09:38:22

2021-03-09 13:18:53

加密解密參數(shù)

2022-06-04 12:25:10

解密加密過濾器

2012-10-22 10:02:34

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)