Spring Boot中POST請求參數校驗的實戰指南

在現代的Web開發中,數據校驗是確保應用程序穩定性和安全性的關鍵環節。Spring Boot提供了強大而靈活的校驗機制,能夠幫助開發者輕松地對POST請求參數進行校驗。本文將詳細介紹如何在Spring Boot中實現POST請求參數的校驗,并通過具體的代碼示例展示其使用方法。

為什么需要校驗POST請求參數?

在處理用戶提交的數據時,校驗是必不可少的一步。它可以幫助我們:

  • 確保數據的完整性和準確性,避免無效或惡意數據進入系統。
  • 提供友好的錯誤提示,提升用戶體驗。
  • 防止常見的安全問題,如SQL注入、XSS攻擊等。

如何在Spring Boot中校驗POST請求參數?

Spring Boot基于Java Bean Validation規范,通過在請求參數類中添加校驗注解,并在控制器中使用@Valid@Validated注解來觸發校驗。以下是詳細的步驟和示例。

步驟1:添加依賴

Spring Boot默認集成了Hibernate Validator,因此大多數情況下你不需要額外添加依賴。如果你使用的是spring-boot-starter-web,校驗功能已經包含在其中。如果你需要明確添加校驗依賴,可以在pom.xml中添加以下內容:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

步驟2:定義請求參數類

定義一個類來表示POST請求的參數,并在字段上使用校驗注解。這些注解來自javax.validationjakarta.validation包。

示例:定義一個用戶注冊的請求參數類
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;public class UserRegistrationRequest {@NotBlank(message = "Username cannot be blank")@Size(min = 3, max = 50, message = "Username must be between 3 and 50 characters")private String username;@NotBlank(message = "Email cannot be blank")@Email(message = "Email must be a valid email address")private String email;@NotBlank(message = "Password cannot be blank")@Size(min = 6, max = 100, message = "Password must be between 6 and 100 characters")private String password;// Getter and Setterpublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

步驟3:在控制器中使用@Valid@Validated

在控制器方法中,使用@Valid@Validated注解來觸發校驗。如果校驗失敗,Spring Boot會自動拋出MethodArgumentNotValidException

示例:定義一個用戶注冊的控制器
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;@RestController
@RequestMapping("/api")
public class UserController {@PostMapping("/register")public ResponseEntity<String> registerUser(@Valid @RequestBody UserRegistrationRequest request) {// 處理用戶注冊邏輯return ResponseEntity.ok("User registered successfully!");}
}

步驟4:全局異常處理

為了更好地處理校驗失敗的情況,可以使用@ControllerAdvice@ExceptionHandler來全局捕獲校驗異常,并返回統一的錯誤響應。

示例:定義全局異常處理器
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getAllErrors().forEach((error) -> {String fieldName = ((FieldError) error).getField();String errorMessage = error.getDefaultMessage();errors.put(fieldName, errorMessage);});return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);}
}

步驟5:測試請求

假設我們發送以下POST請求到/api/register

{"username": "john_doe","email": "john.doe@example.com","password": "password123"
}

如果所有字段都符合校驗規則,則返回:

{"message": "User registered successfully!"
}

如果某些字段不符合校驗規則,例如發送以下請求:

{"username": "j","email": "invalid-email","password": "123"
}

則返回類似以下的錯誤信息:

{"username": "Username must be between 3 and 50 characters","email": "Email must be a valid email address","password": "Password must be between 6 and 100 characters"
}

常用校驗注解

Spring Boot提供了豐富的校驗注解,以下是一些常用的注解及其用途:

注解描述
@NotNull字段不能為null
@NotBlank字符串不能為空或僅包含空白字符
@NotEmpty字符串、集合或數組不能為空
@Size(min = x, max = y)字符串、集合或數組的大小必須在指定范圍內
@Email字符串必須是有效的電子郵件地址
@Min(value = x)數值必須大于或等于指定值
@Max(value = x)數值必須小于或等于指定值
@Past日期必須在過去
@Future日期必須在未來
@Pattern(regexp = "regex")字符串必須匹配指定的正則表達式

自定義校驗注解

如果內置的校驗注解無法滿足需求,可以自定義校驗注解和校驗器。以下是一個自定義校驗注解的示例:

示例:自定義校驗注解

假設我們需要校驗用戶名是否符合特定格式。

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UsernameValidator.class)
public @interface ValidUsername {String message() default "Username must start with a letter and contain only letters and numbers";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
示例:自定義校驗器
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;public class UsernameValidator implements ConstraintValidator<ValidUsername, String> {@Overridepublic boolean isValid(String username, ConstraintValidatorContext context) {return username != null && username.matches("^[a-zA-Z][a-zA-Z0-9]*$");}
}
使用自定義校驗注解
public class UserRegistrationRequest {@ValidUsernameprivate String username;// 其他字段...
}

總結

在Spring Boot中,通過使用@Valid@Validated注解,可以方便地對POST請求參數進行校驗。結合@ControllerAdvice@ExceptionHandler,可以實現全局的異常處理,返回統一的錯誤響應。這樣可以極大地提高代碼的可維護性和用戶體驗。希望本文的介紹和示例能夠幫助你在實際開發中更好地實現POST請求參數的校驗。

如果你有任何問題或建議,歡迎在評論區留言!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87635.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot + MyBatis/MyBatis Plus:XML中循環處理List參數的終極指南

重要提醒&#xff1a;使用Param注解時&#xff0c;務必導入正確的包&#xff01; import org.apache.ibatis.annotations.Param; 很多開發者容易錯誤導入Spring的Param&#xff0c;導致參數綁定失敗&#xff01; 一、為什么需要傳遞List參數&#xff1f; 最常見的場景是動態構…

Design Compiler:自適應重定時(Adaptive Retiming)

相關閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 簡介 重定時是DC Ultra引入的一種時序優化技術&#xff0c;可以將時序單元&#xff08;觸發器和鎖存器&#xff09;穿越組合邏輯前后移動&#xff0c;以優化設…

解決kali Linux在VMware中的全局縮放問題

在每次啟動kali時&#xff0c;因為屏幕分辨率過高&#xff0c;系統整體特別小&#xff0c;該怎么操作調整合適呢 在搜索中搜索kali HiDPI Mode 選擇yes 然后就會自動調整合適了

Python關鍵字梳理

在 Python 中&#xff0c;關鍵字&#xff08;Keywords&#xff09;是具有特殊含義的保留字&#xff0c;它們用于定義語法和結構。async 是 Python 3.5 引入的關鍵字&#xff0c;用于支持異步編程&#xff08;Asynchronous Programming&#xff09;。下面我將詳細講解 async 及其…

結構體實戰:用Rust編寫矩形面積計算器

文章目錄結構體實戰&#xff1a;用Rust編寫矩形面積計算器&#x1f4d0; 問題描述1?? 基礎版&#xff1a;獨立變量&#xff08;混亂版&#xff09;2?? 進階版&#xff1a;使用元組3?? 終極版&#xff1a;使用結構體&#xff08;優雅版&#xff09;&#x1f3af; 運行結果…

基于開源鏈動2+1模式AI智能名片S2B2C商城小程序的場景零售創新研究

摘要&#xff1a;本文聚焦場景消費邏輯&#xff0c;探討開源鏈動21模式AI智能名片S2B2C商城小程序在場景零售中的應用。通過分析場景消費中消費者體驗的關鍵作用&#xff0c;結合該技術組合的特性&#xff0c;闡述其如何優化場景內容、增強場景美感&#xff0c;為消費者創造超乎…

新發布:26考研院校和專業大綱

復習方向錯了&#xff0c;努力可能白費 近日&#xff0c;多所高校陸續發布2026年碩士研究生招生考試自命題科目大綱&#xff0c;為備考的學子們指明了復習方向。今年的考綱有哪些重要變化&#xff1f;又該如何應對&#xff1f;本文為你全面梳理&#xff01; 院校和專業發布詳情…

matlab/Simulink-全套50個汽車性能建模與仿真源碼模型9

50個simulink模型&#xff08;所有模型羅列如下&#xff0c;沒羅列就是沒有&#xff0c;包含子模塊總共50個。&#xff09; 基于汽車驅動力-行駛阻力平衡圖的汽車動力性仿真模型 基于汽車動力特性圖的汽車動力性仿真模型 基于汽車功率平衡圖的汽車動力性仿真模型 電動汽車動力…

為什么星敏感器(Star Tracker)需要時間同步?—— 從原理到應用的全解析

為什么星敏感器&#xff08;Star Tracker&#xff09;需要時間同步&#xff1f;—— 從原理到應用的全解析 引言 在衛星姿態控制系統中&#xff0c;星敏感器&#xff08;Star Tracker, 簡稱“星敏”&#xff09; 是最精確的姿態測量設備之一&#xff0c;其精度可達角秒級&…

【Cocos TypeScript 零基礎 24.1】

目錄 首次實戰開發心得實戰項目<修仙錄游戲> 首次實戰開發心得 遇到的技術問題也多 發表問題也不少 收入問題 本人都將會寫篇專欄總結一下 實戰項目<修仙錄游戲> 上圖是已上線的實戰項目二維碼 耗費的時間太久了 下次將跟新開發遇到的各種奇奇怪怪的問題 各位看…

Linux關機指令詳解:shutdown命令的使用指南

掌握shutdown命令的正確使用對于Linux系統管理員至關重要&#xff0c;它不僅能確保系統安全關閉&#xff0c;還能避免數據丟失和用戶工作中斷。 目錄 一、基本語法 二、常用選項 三、使用示例 立即關機 10分鐘后關機 指定時間關機&#xff08;如23:00&#xff09; 重啟系…

青少年編程與數學 02-022 專業應用軟件簡介 08 電子設計自動化軟件

青少年編程與數學 02-022 專業應用軟件簡介 08 電子設計自動化軟件一、什么是EDA軟件&#xff08;一&#xff09;定義與起源&#xff08;二&#xff09;功能與分類&#xff08;三&#xff09;技術發展趨勢二、EDA軟件在當前國際競爭中的重要性&#xff08;一&#xff09;技術壁…

TypeScript系列:第六篇 - 編寫高質量的TS類型

掌握這些&#xff0c;ts類型聲明事半功倍 &#x1f4aa;&#x1f3fb; 不要做 永遠不要使用類型 Number、String、Boolean、Symbol 或 Object 這些類型指的是非原始裝箱對象&#xff0c;使用 number、string、boolean 和 symbol 類型不要使用 any 作為類型&#xff0c;除非正在…

逐步構建高性能http服務器及聊天室服務器

目錄 如何拿到瀏覽器發來的http請求 如何給瀏覽器發送響應 響應基本原理 給瀏覽器發送一個網頁作為響應 給瀏覽器發送一個圖片作為響應 接下來我們要做什么 完善業務邏輯 瀏覽器如何訪問特定文件 訪問根目錄下的文件 訪問子文件夾下的文件 習慣性目錄結構 GET請求帶…

水下航行器外形分類詳解

在水下航行器的設計領域&#xff0c;外形是影響其性能和功能的關鍵因素之一。根據不同的設計目的和應用場景&#xff0c;水下航行器的外形可以按照多種方式進行分類。 本文將詳細介紹幾種常見的分類方式及其對應的外形特點。 按流體動力布局分類 標準回轉體 外形標準回轉體外…

Ubuntu:Mysql服務器

mariadb與mysql完全兼容&#xff0c;使用時感受不到差別 目錄 1 mariadb的安裝2 啟動mysql3 關閉防火墻4 連接到mysql5 Mysql的配置文件6 Mysql遠程訪問 1 mariadb的安裝 apt install mariadb-server檢查安裝 ls /etc/init.d2 啟動mysql service mysql restart3 關閉防火墻…

使用systemd 監控服務并實現故障自動重啟

一、為什么需要自動重啟&#xff1f; 在生產環境中&#xff0c;服務可能因內存溢出、資源競爭、外部依賴中斷等問題意外崩潰。手動恢復效率低下&#xff0c;而 systemd 的自動重啟機制可在秒級內恢復服務&#xff0c;顯著提升系統可用性。 ?? 二、systemd 自動重啟的核心配置…

在 React 中使用 WebSockets 構建實時聊天應用程序

實時通信已成為現代 Web 應用程序&#xff08;尤其是在聊天應用程序中&#xff09;不可或缺的功能。實時通信提供了一種強大的方法來實現客戶端和服務器之間的實時雙向通信。在本指南中&#xff0c;我們將逐步講解如何使用React WebSockets構建實時聊天應用程序。 先決條件 在…

實驗五-Flask的簡易登錄系統

一、實驗目的和任務 1.掌握Flask框架的基本使用方法 2.理解Web應用的會話管理機制 3.實現用戶認證系統的基本功能 4.學習模板繼承和表單處理技術 要求&#xff1a;請將思考題的答案寫在實驗報告中 二、實驗內容 1.基礎環境搭建&#xff1a;創建項目目錄結構、安裝必要依賴包…

WebSocket類明明注入了Bean,為什么報錯為null

在 WebSocket 類中注入 Bean 看似可行而注入 Bean 報錯為null&#xff0c;通常是由于Spring 的單例管理機制與 WebSocket 多實例創建特性沖突導致的&#xff0c;具體分析如下&#xff1a;原因分析Spring 的單例特性&#xff1a;Spring 默認以單例模式管理 Bean&#xff0c;即一…