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

Spring?Boot項(xiàng)目傳參校驗(yàn)的最佳實(shí)踐指南

 更新時(shí)間:2022年04月05日 10:12:46   作者:架構(gòu)師諸葛  
有參數(shù)傳遞的地方都少不了參數(shù)校驗(yàn),在web開(kāi)發(fā)中前端的參數(shù)校驗(yàn)是為了用戶(hù)體驗(yàn),后端的參數(shù)校驗(yàn)是為了安全,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目傳參校驗(yàn)的最佳實(shí)踐,需要的朋友可以參考下

場(chǎng)景還原

簡(jiǎn)單業(yè)務(wù)場(chǎng)景模擬:

假如你現(xiàn)在在做一個(gè)成績(jī)錄入系統(tǒng),你愉快地用Spring Boot框架寫(xiě)了一個(gè)后臺(tái)接口,用于接收前臺(tái)瀏覽器傳過(guò)來(lái)的 Student對(duì)象,并插入后臺(tái)數(shù)據(jù)庫(kù)。

我們將傳入的 Student對(duì)象定義為:

public class Student {
    private String name;    // 姓名
    private Integer score;  // 考試分?jǐn)?shù)(滿分100分)
    private String mobile;  // 電話號(hào)碼(11位)
}

然后寫(xiě)一個(gè)Post請(qǐng)求的后臺(tái)接口,來(lái)接收網(wǎng)頁(yè)端傳過(guò)來(lái)的 Student對(duì)象:

@RestController
public class TestController {

    @Autowired
    private StudentService studentService;

    @PostMapping("/add")
    public String addStudent( @RequestBody Student student ) {
        studentService.addStudent( student ); // 將student對(duì)象存入數(shù)據(jù)庫(kù)
        return "SUCCESS";
    }
}

此時(shí)我想你一定看出來(lái)了上面這段代碼的漏洞,因?yàn)槲覀儾](méi)有對(duì)傳入的 Student對(duì)象做任何數(shù)據(jù)校驗(yàn),比如:

Student對(duì)象里三個(gè)字段的某一個(gè)忘傳了,為 null怎么辦?Student的 score分?jǐn)?shù),假如寫(xiě)錯(cuò)了,寫(xiě)成 101分怎么辦?Student的 mobile11位手機(jī)號(hào)碼,假如填錯(cuò)了,多寫(xiě)了一位怎么辦?...等等

這些數(shù)據(jù)雖然在前端頁(yè)面一般會(huì)做校驗(yàn),但我們作為一個(gè)嚴(yán)謹(jǐn)且良心的后端開(kāi)發(fā)工程師,我們肯定要對(duì)傳入的每一項(xiàng)數(shù)據(jù)做嚴(yán)格的校驗(yàn),所以我們應(yīng)該怎么寫(xiě)?

@PostMapping("/add")
public String addStudent( @RequestBody Student student ) {
    if( student == null )
        return "傳入的Student對(duì)象為null,請(qǐng)傳值";
    if( student.getName()==null || "".equals(student.getName()) )
        return "傳入的學(xué)生姓名為空,請(qǐng)傳值";
    if( student.getScore()==null )
        return "傳入的學(xué)生成績(jī)?yōu)閚ull,請(qǐng)傳值";
    if( (student.getScore()<0) || (student.getScore()>100) )
        return "傳入的學(xué)生成績(jī)有誤,分?jǐn)?shù)應(yīng)該在0~100之間";
    if( student.getMobile()==null || "".equals(student.getMobile()) )
        return "傳入的學(xué)生電話號(hào)碼為空,請(qǐng)傳值";
    if( student.getMobile().length()!=11 )
        return "傳入的學(xué)生電話號(hào)碼長(zhǎng)度有誤,應(yīng)為11位";
    studentService.addStudent( student ); // 將student對(duì)象存入MySQL數(shù)據(jù)庫(kù)
    return "SUCCESS";
}

寫(xiě)是寫(xiě)完了,就是感覺(jué)手有點(diǎn)酸,并且心有點(diǎn)累,這個(gè) Student對(duì)象倒還好,畢竟內(nèi)部?jī)H3個(gè)字段,假如一個(gè)復(fù)雜的對(duì)象有30個(gè)字段怎么辦?簡(jiǎn)直不敢想象!

神注解加持

其實(shí)Spring框架很早版本開(kāi)始,就通過(guò)注解的方式,來(lái)方便地為我們提供了各項(xiàng)交互數(shù)據(jù)的校驗(yàn)工作,比如上面的例子,我們只需要在傳入的 Student實(shí)體類(lèi)的字段中加入對(duì)應(yīng)注解即可方便的解決問(wèn)題:

public class Student {
    @NotNull(message = "傳入的姓名為null,請(qǐng)傳值")
    @NotEmpty(message = "傳入的姓名為空字符串,請(qǐng)傳值")
    private String name;    // 姓名

    @NotNull(message = "傳入的分?jǐn)?shù)為null,請(qǐng)傳值")
    @Min(value = 0,message = "傳入的學(xué)生成績(jī)有誤,分?jǐn)?shù)應(yīng)該在0~100之間")
    @Max(value = 100,message = "傳入的學(xué)生成績(jī)有誤,分?jǐn)?shù)應(yīng)該在0~100之間")
    private Integer score;  // 分?jǐn)?shù)

    @NotNull(message = "傳入的電話為null,請(qǐng)傳值")
    @NotEmpty(message = "傳入的電話為空字符串,請(qǐng)傳值")
    @Length(min = 11, max = 11, message = "傳入的電話號(hào)碼長(zhǎng)度有誤,必須為11位")
    private String mobile;  // 電話號(hào)碼
}

當(dāng)然,于此同時(shí),我們還需要在對(duì)象入口處,加上注解 @Valid來(lái)開(kāi)啟對(duì)傳入 Student對(duì)象的驗(yàn)證工作:

@PostMapping("/add")
public String addStudent( @RequestBody  @Valid Student student ) {
    // 棒棒噠!原先各種繁雜的參數(shù)校驗(yàn)工作統(tǒng)統(tǒng)都省了!一行代碼不用寫(xiě)
    studentService.addStudent( student ); // 將student對(duì)象存入MySQL數(shù)據(jù)庫(kù)
    return "SUCCESS";
}

這時(shí)候,如果某個(gè)字段傳入錯(cuò)誤,比如我傳數(shù)據(jù)的時(shí)候,將學(xué)生的成績(jī)誤傳為 101分,則接口返回結(jié)果便會(huì)提示出錯(cuò)誤詳情:

 

當(dāng)然,關(guān)于這個(gè)事情的原理,既然用到了注解,無(wú)非用的也就是Java里的各種反射等知識(shí)來(lái)實(shí)現(xiàn)的,感興趣的小伙伴可以借此機(jī)會(huì)研究一下!

數(shù)據(jù)異常統(tǒng)一攔截

上面利用注解的方式做統(tǒng)一數(shù)據(jù)校驗(yàn)感覺(jué)十分美好,但唯一美中不足的就是返回的結(jié)果太過(guò)繁雜,不一定使我們需要的格式,我們需要做統(tǒng)一處理,比如:我只想將具體參數(shù)校驗(yàn)的錯(cuò)誤提示信息給摳出來(lái)返回給前端即可。

為此,我們?yōu)轫?xiàng)目配置全局統(tǒng)一異常攔截器來(lái)格式化所有數(shù)據(jù)校驗(yàn)的返回結(jié)果。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionInterceptor {
  @ExceptionHandler(value = Exception.class)
  public String exceptionHandler(HttpServletRequest request, Exception e) {
    String failMsg = null;
    if (e instanceof MethodArgumentNotValidException) {
      // 拿到參數(shù)校驗(yàn)具體異常信息提示
      failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
    }
    return failMsg; // 直接吐回給前端
  }
}

如上面代碼所示,我們全局統(tǒng)一攔截了參數(shù)校驗(yàn)異常 MethodArgumentNotValidException,并僅僅只拿到對(duì)應(yīng)異常的詳細(xì) Message信息吐給前端,此時(shí)返回給前端的數(shù)據(jù)就清楚得多:

可以的,非常優(yōu)雅!

總結(jié)

到此這篇關(guān)于Spring Boot項(xiàng)目傳參校驗(yàn)的文章就介紹到這了,更多相關(guān)SpringBoot項(xiàng)目傳參校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Gson 整合Fastjson的實(shí)例詳解

    SpringBoot整合Gson 整合Fastjson的實(shí)例詳解

    這篇文章主要介紹了SpringBoot整合Gson 整合Fastjson的實(shí)例詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java中鎖的分類(lèi)與使用方法

    Java中鎖的分類(lèi)與使用方法

    這篇文章主要給大家介紹了關(guān)于Java中鎖分類(lèi)與使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換

    java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換

    本文介紹在java中IP地址轉(zhuǎn)換十進(jìn)制數(shù)及把10進(jìn)制再轉(zhuǎn)換成IP地址的方法及實(shí)例參考,曬出來(lái)和大家分享一下
    2012-12-12
  • Java7到Java17之Switch語(yǔ)句進(jìn)化史示例詳解

    Java7到Java17之Switch語(yǔ)句進(jìn)化史示例詳解

    這篇文章主要為大家介紹了Java7到Java17之Switch語(yǔ)句進(jìn)化史示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 快速使用IDEA圖形化界面連接Phoenix的方法

    快速使用IDEA圖形化界面連接Phoenix的方法

    最近很多朋友跟小編留言如何使用IDEA圖形化界面連接Phoenix,在這小編就不一一回復(fù)大家了,今天抽空給大家整理一篇教程關(guān)于idea 圖形化界面連接Phoenix的相關(guān)知識(shí),需要的朋友快來(lái)學(xué)習(xí)下吧
    2021-05-05
  • Sharding-Proxy分庫(kù)分表和數(shù)據(jù)加密使用場(chǎng)景分析

    Sharding-Proxy分庫(kù)分表和數(shù)據(jù)加密使用場(chǎng)景分析

    這篇文章主要介紹了Sharding-Proxy分庫(kù)分表和數(shù)據(jù)加密使用經(jīng)驗(yàn)分享,通過(guò)場(chǎng)景模擬分析結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • MyBatis 接收數(shù)據(jù)庫(kù)中沒(méi)有的字段的解決

    MyBatis 接收數(shù)據(jù)庫(kù)中沒(méi)有的字段的解決

    這篇文章主要介紹了MyBatis 接收數(shù)據(jù)庫(kù)中沒(méi)有的字段的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中Elasticsearch的4種分頁(yè)方式詳解

    Java中Elasticsearch的4種分頁(yè)方式詳解

    在?Elasticsearch?中,有?4種常見(jiàn)的分頁(yè)方法,本文將帶大家分析一下每種方法的優(yōu)缺點(diǎn)以及我們?cè)撊绾芜x擇,感興趣的小伙伴可以參考一下
    2025-01-01
  • 詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))

    詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))

    這篇文章主要介紹了JAVA NIO之Buffer(緩沖區(qū))的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的學(xué)習(xí)JAVA NIO,感興趣的朋友可以了解下
    2020-07-07
  • Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline seat in use

    Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline 

    本文主要介紹了Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline seat in use,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

湟源县| 景宁| 大姚县| 竹溪县| 咸宁市| 新竹市| 招远市| 钟祥市| 永济市| 铜陵市| 平原县| 齐河县| 虹口区| 灯塔市| 新晃| 巴塘县| 稻城县| 营口市| 惠水县| 万年县| 牟定县| 高阳县| 梁平县| 安平县| 舟曲县| 余干县| 大姚县| 穆棱市| 乡城县| 盐源县| 高碑店市| 辉南县| 伽师县| 县级市| 镇沅| 台北县| 志丹县| 汽车| 沁阳市| 西和县| 巴彦县|