国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot參數(shù)驗(yàn)證的10個(gè)技巧1

jf_78858299 ? 來(lái)源:JAVA旭陽(yáng) ? 作者:JAVA旭陽(yáng) ? 2023-04-07 15:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

參數(shù)驗(yàn)證很重要,是平時(shí)開(kāi)發(fā)環(huán)節(jié)中不可少的一部分,但是我想很多后端同事會(huì)偷懶,干脆不錯(cuò),這樣很可能給系統(tǒng)的穩(wěn)定性和安全性帶來(lái)嚴(yán)重的危害。那么在Spring Boot應(yīng)用中如何做好參數(shù)校驗(yàn)工作呢,本文提供了10個(gè)小技巧,你知道幾個(gè)呢?

1.使用驗(yàn)證注解

Spring Boot提供了內(nèi)置的驗(yàn)證注解,可以幫助簡(jiǎn)單、快速地對(duì)輸入字段進(jìn)行驗(yàn)證,例如檢查 null 或空字段、強(qiáng)制執(zhí)行長(zhǎng)度限制、使用正則表達(dá)式驗(yàn)證模式以及驗(yàn)證電子郵件地址。

一些最常用的驗(yàn)證注釋包括:

  • @NotNull:指定字段不能為空。
  • @NotEmpty:指定列表字段不能為空。
  • @NotBlank:指定字符串字段不得為空或僅包含空格。
  • @Min@Max:指定數(shù)字字段的最小值和最大值。
  • @Pattern:指定字符串字段必須匹配的正則表達(dá)式模式。
  • @Email:指定字符串字段必須是有效的電子郵件地址。

具體用法參考下面例子:

public class User {
    @NotNull
    private Long id;

    @NotBlank
    @Size(min = 2, max = 50)
    private String firstName;

    @NotBlank
    @Size(min = 2, max = 50)
    private String lastName;

    @Email
    private String email;

    @NotNull
    @Min(18)
    @Max(99)
    private Integer age;

    @NotEmpty
    private List

2 使用自定義驗(yàn)證注解

雖然 Spring Boot 的內(nèi)置驗(yàn)證注釋很有用,但它們可能無(wú)法涵蓋所有情況。如果有特殊參數(shù)驗(yàn)證的場(chǎng)景,可以使用 Spring 的 JSR 303 驗(yàn)證框架創(chuàng)建自定義驗(yàn)證注釋。自定義注解可以讓你的的驗(yàn)證邏輯更具可重用性和可維護(hù)性。

假設(shè)我們有一個(gè)應(yīng)用程序,用戶(hù)可以在其中創(chuàng)建帖子。每個(gè)帖子都應(yīng)該有一個(gè)標(biāo)題和一個(gè)正文,并且標(biāo)題在所有帖子中應(yīng)該是唯一的。雖然 Spring Boot 提供了用于檢查字段是否為空的內(nèi)置驗(yàn)證注釋?zhuān)鼪](méi)有提供用于檢查唯一性的內(nèi)置驗(yàn)證注釋。在這種情況下,我們可以創(chuàng)建一個(gè)自定義驗(yàn)證注解來(lái)處理這種情況。

首先,我們創(chuàng)建自定義約束注解UniqueTitle

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueTitleValidator.class)
public @interface UniqueTitle {
    String message() default "Title must be unique";

    Class?[] groups() default {};

    Class? extends Payload[] payload() default {};
}

接下來(lái),我們創(chuàng)建一個(gè)PostRepository接口,目的是從數(shù)據(jù)庫(kù)中檢索帖子:

public interface PostRepository extends JpaRepository<Post, Long> {
    Post findByTitle(String title);
}

然后我們需要定義驗(yàn)證器類(lèi) UniqueTitleValidator,如下所示:

@Component
public class UniqueTitleValidator implements ConstraintValidator<UniqueTitle, String> {

    @Autowired
    private PostRepository postRepository;

    @Override
    public boolean isValid(String title, ConstraintValidatorContext context) {
        if (title == null) {
            return true;
        }
        return Objects.isNull(postRepository.findByTitle(title));
    }
}

UniqueTitleValidator實(shí)現(xiàn)了ConstraintValidator接口,它有兩個(gè)泛型類(lèi)型:第一個(gè)是自定義注解UniqueTitle,第二個(gè)是正在驗(yàn)證的字段類(lèi)型(在本例中為String). 我們還自動(dòng)裝配了PostRepository 類(lèi)以從數(shù)據(jù)庫(kù)中檢索帖子。

isValid()方法通過(guò)查詢(xún) PostRepository 來(lái)檢查 title 是否為 null 或者它是否是唯一的。如果 title 為 null 或唯一,則驗(yàn)證成功,并返回 true。

定義了自定義驗(yàn)證注釋和驗(yàn)證器類(lèi)后,我們現(xiàn)在可以使用它來(lái)驗(yàn)證 Spring Boot 應(yīng)用程序中的帖子標(biāo)題:

public class Post {
    @UniqueTitle
    private String title;

    @NotNull
    private String body;
}

我們已將 @UniqueTitle 注釋?xiě)?yīng)用于 Post 類(lèi)中的 title 變量。驗(yàn)證此字段時(shí),這將觸發(fā) UniqueTitleValidator 類(lèi)中定義的驗(yàn)證邏輯。

3 在服務(wù)器端驗(yàn)證

除了前端或者客戶(hù)端做了驗(yàn)證意外,服務(wù)器端驗(yàn)證輸入是至關(guān)重要的。它可以確保在處理或存儲(chǔ)任何惡意或格式錯(cuò)誤的數(shù)據(jù)之前將其捕獲,這對(duì)于應(yīng)用程序的安全性和穩(wěn)定性至關(guān)重要。

假設(shè)我們有一個(gè)允許用戶(hù)創(chuàng)建新帳戶(hù)的 REST 端點(diǎn)。端點(diǎn)需要一個(gè)包含用戶(hù)用戶(hù)名和密碼的 JSON 請(qǐng)求體。為確保輸入有效,我們可以創(chuàng)建一個(gè) DTO(數(shù)據(jù)傳輸對(duì)象)類(lèi)并將驗(yàn)證注釋?xiě)?yīng)用于其字段:

public class UserDTO {

    @NotBlank
    private String username;

    @NotBlank
    private String password;
}

我們使用@NotBlank注解來(lái)確保usernamepassword字段不為空或 null。

接下來(lái),我們可以創(chuàng)建一個(gè)控制器方法來(lái)處理 HTTP POST 請(qǐng)求并在創(chuàng)建新用戶(hù)之前驗(yàn)證輸入:

@RestController
@RequestMapping("/users")
@Validated
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping
    public ResponseEntity

我們使用 Spring 的@Validated注解來(lái)啟用方法級(jí)驗(yàn)證,我們還將 @Valid 注釋?xiě)?yīng)用于 userDto 參數(shù)以觸發(fā)驗(yàn)證過(guò)程。

4 提供有意義的錯(cuò)誤信息

當(dāng)驗(yàn)證失敗時(shí),必須提供清晰簡(jiǎn)潔的錯(cuò)誤消息來(lái)描述出了什么問(wèn)題以及如何修復(fù)它。

這是一個(gè)示例,如果我們有一個(gè)允許用戶(hù)創(chuàng)建新用戶(hù)的 RESTful API。我們要確保姓名和電子郵件地址字段不為空,年齡在 18 到 99 歲之間,除了這些字段,如果用戶(hù)嘗試使用重復(fù)的“用戶(hù)名”創(chuàng)建帳戶(hù),我們還會(huì)提供明確的錯(cuò)誤消息或“電子郵件”。

為此,我們可以定義一個(gè)帶有必要驗(yàn)證注釋的模型類(lèi) User,如下所示:

public class User {

    @NotBlank(message = "用戶(hù)名不能為空")
    private String name;

    @NotBlank(message = "Email不能為空")
    @Email(message = "無(wú)效的Emaild地址")
    private String email;

    @NotNull(message = "年齡不能為空")
    @Min(value = 18, message = "年齡必須大于18")
    @Max(value = 99, message = "年齡必須小于99")
    private Integer age;
}
  • 我們使用 message屬性為每個(gè)驗(yàn)證注釋提供了自定義錯(cuò)誤消息。

接下來(lái),在我們的 Spring 控制器中,我們可以處理表單提交并使用 @Valid 注釋驗(yàn)證用戶(hù)輸入:

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody User user, BindingResult result) {
        if (result.hasErrors()) {
            List<String> errorMessages = result.getAllErrors().stream()
                    .map(DefaultMessageSourceResolvable::getDefaultMessage)
                    .collect(Collectors.toList());
            return ResponseEntity.badRequest().body(errorMessages.toString());
        }

        // save the user to the database using UserService
        userService.saveUser(user);

        return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully");
    }
}
  • 我們使用 @Valid 注釋來(lái)觸發(fā) User 對(duì)象的驗(yàn)證,并使用 BindingResult 對(duì)象來(lái)捕獲任何驗(yàn)證錯(cuò)誤。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開(kāi)發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    378

    瀏覽量

    42144
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1869

    瀏覽量

    33945
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    15935
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    177

    瀏覽量

    684
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SpringBoot配置Mybatis的2個(gè)錯(cuò)誤和修正

    SpringBoot】配置Mybatis錯(cuò)誤
    發(fā)表于 04-19 10:31

    SpringBoot中的Druid介紹

    SpringBoot中Druid數(shù)據(jù)源配置
    發(fā)表于 05-07 09:21

    SpringBoot知識(shí)總結(jié)

    SpringBoot干貨學(xué)習(xí)總結(jié)
    發(fā)表于 08-01 10:40

    怎么學(xué)習(xí)SpringBoot

    SpringBoot學(xué)習(xí)之路(X5)- 整合JPA
    發(fā)表于 06-10 14:52

    springboot集成mqtt

    springboot集成mqtt,大綱一.數(shù)據(jù)入庫(kù)1.數(shù)據(jù)入庫(kù)解決方案二.開(kāi)發(fā)實(shí)時(shí)訂閱發(fā)布展示頁(yè)面1.及時(shí)通訊技術(shù)2.技術(shù)整合
    發(fā)表于 07-16 07:53

    怎樣去使用springboot

    怎樣去使用springboot呢?學(xué)習(xí)springboot需要懂得哪些?
    發(fā)表于 10-25 07:13

    SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法

    什么時(shí)候創(chuàng)建嵌入式的Servlet容器工廠?什么時(shí)候獲取嵌入式的Servlet容器并啟動(dòng)Tomcat;獲取嵌入式的Servlet容器工廠:1)、SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法2
    發(fā)表于 12-20 06:16

    怎樣去設(shè)計(jì)一個(gè)基于springboot+freemark+jpa+MySQL的在線電影訂票系統(tǒng)

    實(shí)現(xiàn)的功能有:前臺(tái): 1、正在上映的電影瀏覽查看,可在線播放預(yù)告視頻。 2、影院信息瀏覽查看,包括各影院上映場(chǎng)次數(shù)。 3、新聞咨詢(xún)信息瀏覽查看。 4、地域信息查看切換。 5、用戶(hù)注冊(cè)登錄,登錄支持發(fā)送短信驗(yàn)證碼登錄和...
    發(fā)表于 01-03 07:22

    個(gè)無(wú)需注解的SpringBoot API文檔生成神器

    如果提交的表單是 application/x-www-form-urlencoded 類(lèi)型的key/value格式,你可以在 SpringBoot 端通過(guò)在 @param 參數(shù)后添加字段解釋或者在相關(guān)的JavaBean對(duì)象里面添加解釋?zhuān)?/div>
    的頭像 發(fā)表于 03-13 09:38 ?1697次閱讀

    什么是 SpringBoot

    本文從為什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里開(kāi)始入手,逐步分析了 `SpringBoot` 自動(dòng)裝配的原理,最后手寫(xiě)了一個(gè)簡(jiǎn)單的 `sta
    的頭像 發(fā)表于 04-07 11:28 ?2279次閱讀
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot常用注解及使用方法1

    基于 SpringBoot 平臺(tái)開(kāi)發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于`Spring`開(kāi)發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開(kāi)發(fā),而且非常簡(jiǎn)單,基本可以做到開(kāi)箱即用! 那 SpringBoot
    的頭像 發(fā)表于 04-07 11:51 ?1262次閱讀

    SpringBoot的核心注解1

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?1296次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解<b class='flag-5'>1</b>

    SpringBoot的核心注解2

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?2515次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解2

    SpringBoot參數(shù)驗(yàn)證10個(gè)技巧2

    如果你的應(yīng)用程序支持多種語(yǔ)言,則必須使用國(guó)際化 (i18n) 以用戶(hù)首選語(yǔ)言顯示錯(cuò)誤消息。 以下是在 Spring Boot 應(yīng)用程序中使用 i18n 處理錯(cuò)誤消息的示例
    的頭像 發(fā)表于 04-07 15:11 ?1930次閱讀

    個(gè)注解搞定SpringBoot接口防刷

    技術(shù)要點(diǎn):springboot的基本知識(shí),redis基本操作,
    的頭像 發(fā)表于 11-28 10:46 ?862次閱讀