成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringBoot 實(shí)戰(zhàn) (十五) | 服務(wù)端參數(shù)校驗(yàn)之一

QiShare / 433人閱讀

摘要:前言估計(jì)很多朋友都認(rèn)為參數(shù)校驗(yàn)是客戶端的職責(zé),不關(guān)服務(wù)端的事。輕則導(dǎo)致服務(wù)器宕機(jī),重則泄露數(shù)據(jù)。所以,這時(shí)就需要設(shè)置第二道關(guān)卡,服務(wù)端驗(yàn)證了。老項(xiàng)目的服務(wù)端校驗(yàn)不能為空不能為空看以上代碼,就一個(gè)的校驗(yàn)就如此麻煩。

前言

估計(jì)很多朋友都認(rèn)為參數(shù)校驗(yàn)是客戶端的職責(zé),不關(guān)服務(wù)端的事。其實(shí)這是錯(cuò)誤的,學(xué)過 Web 安全的都知道,客戶端的驗(yàn)證只是第一道關(guān)卡。它的參數(shù)驗(yàn)證并不是安全的,一旦被有心人抓到可乘之機(jī),他就可以有各種方法來摸擬系統(tǒng)的 Http 請(qǐng)求,訪問數(shù)據(jù)庫(kù)的關(guān)鍵數(shù)據(jù)。輕則導(dǎo)致服務(wù)器宕機(jī),重則泄露數(shù)據(jù)。所以,這時(shí)就需要設(shè)置第二道關(guān)卡,服務(wù)端驗(yàn)證了。

老項(xiàng)目的服務(wù)端校驗(yàn)
@RestController
@RequestMapping("/student")
public class ValidateOneController {

    @GetMapping("/id")
    public Student findStudentById(Integer id){
        if(id == null){
              logger.error("id 不能為空!");
              throw new NullPointerException("id 不能為空");
        }
        return studentService.findStudentById(id);
    }
}

看以上代碼,就一個(gè)的校驗(yàn)就如此麻煩。那我們是否有好的統(tǒng)一校驗(yàn)方法呢?鑒于 SpringBoot 無所不能。答案當(dāng)然是有的。

其中,Bean Validator 和 Hibernate Validator 就是兩套用于驗(yàn)證的框架,二者都遵循 JSR-303 ,可以混著用,鑒于二者的某些 Validator 注解有差別,例如 @Length 在 Bean Validator 中是沒有的,所以這里我選擇混合用。

JSR-303

JSR-303 是JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,Hibernate Validator 是 Bean Validation 的參考實(shí)現(xiàn), Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 Constraint(約束) 的實(shí)現(xiàn),除此之外還有一些附加的 Constraint 。這些 Constraint (約束) 全都通過注解的方式實(shí)現(xiàn),請(qǐng)看下面兩個(gè)表。

Bean Validation 中內(nèi)置的約束:

注解 作用
@Null 被注解參數(shù)必須為空
@NotNull 被注解參數(shù)不能為空
@AssertTrue 被注解參數(shù)必須為 True
@AssertFalse 被注解參數(shù)必須為 False
@Min(value) 被注解參數(shù)必須是數(shù)字,且其值必須大于等于 value
@Max(value) 被注解參數(shù)必須是數(shù)字,且其值必須小于等于 value
@DecimaMin(value) 被注解參數(shù)必須是數(shù)字,且其值必須大于等于 value
@DecimaMax(value) 被注解參數(shù)必須是數(shù)字,且其值必須小于等于 value
@Size(max, min) 被注解參數(shù)大小必須在指定范圍內(nèi)
@Past 被注解參數(shù)必須是一個(gè)過去的日期
@Future 被注解參數(shù)必須是一個(gè)將來的日期
@Pattern(value) 被注解參數(shù)必須符合指定的正則表達(dá)式
@Digits(integer, fraction) 被注解參數(shù)必須是數(shù)字,且其值必須在可接受范圍內(nèi)
@NotBlank 被注解參數(shù)的值不為空(不為 null、去除首位空格后長(zhǎng)度為 0),不同于 @NotEmpty,@NotBlank 只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格

Hibernate Validator 附加的約束:

注解 作用
@NotEmpty 被注解參數(shù)的值不為 null 且不為空(字符串長(zhǎng)度不為0、集合大小不為0)
@Email 被注解參數(shù)必須是電子郵箱地址
@Length 被注解的字符串長(zhǎng)度必須在指定范圍內(nèi)
@Range 被注解的參數(shù)必須在指定范圍內(nèi)
準(zhǔn)備工作

SpringBoot 2.1.3

IDEA

JDK8

Pom 文件依賴


    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-test
    test



    org.projectlombok
    lombok
    true
實(shí)體類

用于測(cè)試,加入了參數(shù)校驗(yàn)規(guī)則。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private Integer id;

    @NotBlank(message = "學(xué)生名字不能為空")
    @Length(min = 2, max = 10, message = "name 長(zhǎng)度必須在 {min} - {max} 之間")
    private String name;

    @NotNull(message = "年齡不允許為空")
    @Min(value = 0, message = "年齡不能低于 {value} 歲")
    private Integer age;
}
Controller 層

寫了兩個(gè)方法,一個(gè)用于校驗(yàn)普通參數(shù),一個(gè)用于校驗(yàn)對(duì)象

@Validated //開啟數(shù)據(jù)校驗(yàn),添加在類上用于校驗(yàn)方法,添加在方法參數(shù)中用于校驗(yàn)參數(shù)對(duì)象。(添加在方法上無效)
@RestController
@RequestMapping("/student")
public class ValidateOneController {

    /**
     * 普通參數(shù)校驗(yàn)
     * @param name
     * @return
     */
    @GetMapping("/name")
    public String findStudentByName(@NotBlank(message = "學(xué)生名字不能為空")
    @Length(min = 2, max = 10, message = "name 長(zhǎng)度必須在 {min} - {max} 之間")String name){
        return "success";
    }

    /**
     * 對(duì)象校驗(yàn)
     * @param student
     * @return
     */
    @PostMapping("/add")
    public String addStudent(@Validated @RequestBody Student student){
        return "success";
    }
}
Postman 測(cè)試

校驗(yàn)普通參數(shù)測(cè)試結(jié)果:

下圖可以看見,我沒有在 http://localhost:8080/student/name 地址后添加 name 參數(shù),傳到后臺(tái)馬上就校驗(yàn)出異常了。而這個(gè)異常信息就是我定義的校驗(yàn)異常信息。

校驗(yàn)對(duì)象測(cè)試結(jié)果:

結(jié)果有點(diǎn)長(zhǎng):

下圖可以看見,我訪問 http://localhost:8080/student/add 傳入了參數(shù)對(duì)象,但對(duì)象是不能通過校驗(yàn)規(guī)則的,比如 age 參數(shù)為負(fù)數(shù),name 參數(shù)長(zhǎng)度太大,傳到后臺(tái)馬上就校驗(yàn)出異常了。而這個(gè)異常信息就是我定義的校驗(yàn)異常信息。

完整代碼

https://github.com/turoDog/De...

如果覺得對(duì)你有幫助,請(qǐng)給個(gè) Star 再走唄,非常感謝。

后語(yǔ)

如果本文對(duì)你哪怕有一丁點(diǎn)幫助,請(qǐng)幫忙點(diǎn)好看。你的好看是我堅(jiān)持寫作的動(dòng)力。

另外,關(guān)注之后在發(fā)送 1024 可領(lǐng)取免費(fèi)學(xué)習(xí)資料。

資料詳情請(qǐng)看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73522.html

相關(guān)文章

  • 【ShareBook】1-后臺(tái)框架與小程序用戶登錄接口實(shí)戰(zhàn)

    摘要:注冊(cè)流程是從小程序簡(jiǎn)稱,以下替代獲取用戶的,給到服務(wù)器,服務(wù)器會(huì)用還有自己的等信息一起去微信服務(wù)器請(qǐng)求用戶數(shù)據(jù),注意每一個(gè)所對(duì)應(yīng)的用戶都是不一樣的。 本博客 貓叔的博客,轉(zhuǎn)載請(qǐng)申明出處閱讀本文約 5分鐘適讀人群:Java后端、Java初級(jí)、小程序前端 前后端項(xiàng)目的地址 ShareBookServer ShareBookClient 小程序前端 showImg(https://seg...

    zorro 評(píng)論0 收藏0
  • Spring Boot 2.x (十五):Dubbo + Zookeeper + 新版Dubbo A

    摘要:簡(jiǎn)介是阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和框架無縫集成。它提供了三大核心能力面向接口的遠(yuǎn)程方法調(diào)用智能容錯(cuò)和負(fù)載均衡服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)。首先我們需要前往官網(wǎng)下載安裝包。 Dubbo 簡(jiǎn)介 Dubbo是阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的RPC實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和Spring框架無縫集...

    DobbyKim 評(píng)論0 收藏0
  • 第二十五章:SpringBoot添加支持CORS跨域訪問

    摘要:本章目標(biāo)基于項(xiàng)目搭建可以站外請(qǐng)求訪問的跨域資源服務(wù)器。允許所有的請(qǐng)求域名訪問我們的跨域資源,可以固定單條或者多條內(nèi)容,如,只有百度可以訪問我們的跨域資源。 CORS(Cross-Origin Resource Sharing)跨域資源共享,是一個(gè)W3C標(biāo)準(zhǔn),它允許瀏覽器向跨域服務(wù)器發(fā)送Ajax請(qǐng)求,打破了Ajax只能訪問本站內(nèi)的資源限制,CORS在很多地方都有被使用,微信支付的JS支付...

    simpleapples 評(píng)論0 收藏0
  • 第三十五章:SpringBoot與單元測(cè)試的小秘密

    摘要:本章目的基于平臺(tái)整合分別完成客戶端服務(wù)端的單元測(cè)試。在測(cè)試控制器內(nèi)添加了三個(gè)測(cè)試方法,我們接下來開始編寫單元測(cè)試代碼??偨Y(jié)本章主要介紹了基于平臺(tái)的兩種單元測(cè)試方式,一種是在服務(wù)端采用注入方式將需要測(cè)試的或者注入到測(cè)試類中,然后調(diào)用方法即可。 單元測(cè)試對(duì)于開發(fā)人員來說是非常熟悉的,我們每天的工作也都是圍繞著開發(fā)與測(cè)試進(jìn)行的,在最早的時(shí)候測(cè)試都是采用工具Debug模式進(jìn)行調(diào)試程序,后來Ju...

    hikui 評(píng)論0 收藏0
  • SpringBoot非官方教程 | 第二十五篇:2小時(shí)學(xué)會(huì)springboot

    摘要:一什么是摘自官網(wǎng)翻譯采納了建立生產(chǎn)就緒應(yīng)用程序的觀點(diǎn)。優(yōu)先于配置的慣例,旨在讓您盡快啟動(dòng)和運(yùn)行。致力于簡(jiǎn)潔,讓開發(fā)者寫更少的配置,程序能夠更快的運(yùn)行和啟動(dòng)。二搭建第一個(gè)程序可以在上建項(xiàng)目,也可以用構(gòu)建。已經(jīng)凌晨了,我要睡了源碼 一.什么是spring boot Takes an opinionated view of building production-ready Spring a...

    baukh789 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<