亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解

瀏覽:5日期:2023-08-12 15:55:35

B/S 系統(tǒng)中對http 請求數(shù)據(jù)的校驗(yàn)多數(shù)在客戶端進(jìn)行,這也是出于簡單及用戶體驗(yàn)性上考慮,但是在一些安全性要求高的系統(tǒng)中服務(wù)端校驗(yàn)是不可缺少的,實(shí)際上,幾乎所有的系統(tǒng),凡是涉及到數(shù)據(jù)校驗(yàn),都需要在服務(wù)端進(jìn)行二次校驗(yàn)。為什么要在服務(wù)端進(jìn)行二次校驗(yàn)?zāi)兀窟@需要理解客戶端校驗(yàn)和服務(wù)端校驗(yàn)各自的目的。

客戶端校驗(yàn),我們主要是為了提高用戶體驗(yàn),例如用戶輸入一個郵箱地址,要校驗(yàn)這個郵箱地址是否合法,沒有必要發(fā)送到服務(wù)端進(jìn)行校驗(yàn),直接在前端用 js 進(jìn)行校驗(yàn)即可。但是大家需要明白的是,前端校驗(yàn)無法代替后端校驗(yàn),前端校驗(yàn)可以有效的提高用戶體驗(yàn),但是無法確保數(shù)據(jù)完整性,因?yàn)樵?B/S 架構(gòu)中,用戶可以方便的拿到請求地址,然后直接發(fā)送請求,傳遞非法參數(shù)。服務(wù)端校驗(yàn),雖然用戶體驗(yàn)不好,但是可以有效的保證數(shù)據(jù)安全與完整性。綜上,實(shí)際項(xiàng)目中,兩個一起用。

Spring 支持JSR-303 驗(yàn)證框架,JSR-303 是 JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,官方參考實(shí)現(xiàn)是 Hibernate Validator(與Hibernate ORM 沒有關(guān)系),JSR-303 用于對 Java Bean 中的字段的值進(jìn)行驗(yàn)證。

普通校驗(yàn)

普通校驗(yàn),是這里最基本的用法。

首先,我們需要加入校驗(yàn)需要的依賴:

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.0.Final</version></dependency>

接下來,在 SpringMVC 的配置文件中配置校驗(yàn)的 Bean:

<bean id='validatorFactoryBean'> <property name='providerClass' value='org.hibernate.validator.HibernateValidator'/></bean><mvc:annotation-driven validator='validatorFactoryBean'/>

配置時,提供一個 LocalValidatorFactoryBean 的實(shí)例,然后 Bean 的校驗(yàn)使用 HibernateValidator。

這樣,配置就算完成了。

接下來,我們提供一個添加學(xué)生的頁面:

<form action='/addstudent' method='post'> <table> <tr> <td>學(xué)生編號:</td> <td><input type='text' name='id'></td> </tr> <tr> <td>學(xué)生姓名:</td> <td><input type='text' name='name'></td> </tr> <tr> <td>學(xué)生郵箱:</td> <td><input type='text' name='email'></td> </tr> <tr> <td>學(xué)生年齡:</td> <td><input type='text' name='age'></td> </tr> <tr> <td colspan='2'><input type='submit' value='提交'> </td> </tr> </table></form>

在這里需要提交的數(shù)據(jù)中,假設(shè)學(xué)生編號不能為空,學(xué)生姓名長度不能超過 10 且不能為空,郵箱地址要合法,年齡不能超過 150。那么在定義實(shí)體類的時候,就可以加入這個判斷條件了。

public class Student { @NotNull private Integer id; @NotNull @Size(min = 2,max = 10) private String name; @Email private String email; @Max(150) private Integer age;...}

在這里:

@NotNull 表示這個字段不能為空 @Size 中描述了這個字符串長度的限制 @Email 表示這個字段的值必須是一個郵箱地址 @Max 表示這個字段的最大值

定義完成后,接下來,在 Controller 中定義接口:

@Controllerpublic class StudentController { @RequestMapping('/addstudent') @ResponseBody public void addStudent(@Validated Student student, BindingResult result) { if (result != null) { //校驗(yàn)未通過,獲取所有的異常信息并展示出來 List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError allError : allErrors) {System.out.println(allError.getObjectName()+':'+allError.getDefaultMessage()); } } }}

在這里:

@Validated 表示 Student 中定義的校驗(yàn)規(guī)則將會生效 BindingResult 表示出錯信息,如果這個變量不為空,表示有錯誤,否則校驗(yàn)通過。

接下來就可以啟動項(xiàng)目了。訪問 jsp 頁面,然后添加 Student,查看校驗(yàn)規(guī)則是否生效。

默認(rèn)情況下,打印出來的錯誤信息時系統(tǒng)默認(rèn)的錯誤信息,這個錯誤信息,我們也可以自定義。自定義方式如下:

由于 properties 文件中的中文會亂碼,所以需要我們先修改一下 IDEA 配置,點(diǎn)File?>Settings->Editor?>File Encodings,如下:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6901df99-8a2e-418b-b791-77cff9fc1bb7/Untitled.png

然后定義錯誤提示文本,在 resources 目錄下新建一個 MyMessage.properties 文件,內(nèi)容如下:

student.id.notnull=id 不能為空student.name.notnull=name不能為空student.name.length=name最小長度為 2 ,最大長度為10student.email.error=email地址非法student.age.error=年齡不能超過 150

接下來,在 SpringMVC 配置中,加載這個配置文件:

<bean id='validatorFactoryBean'> <property name='providerClass' value='org.hibernate.validator.HibernateValidator'/> <property name='validationMessageSource' ref='bundleMessageSource'/></bean><bean id='bundleMessageSource'> <property name='basenames'> <list> <value>classpath:MyMessage</value> </list> </property> <property name='defaultEncoding' value='UTF-8'/> <property name='cacheSeconds' value='300'/></bean><mvc:annotation-driven validator='validatorFactoryBean'/>

最后,在實(shí)體類上,加上校驗(yàn)出錯時的消息

public class Student { @NotNull(message = '{student.id.notnull}') private Integer id; @NotNull(message = '{student.name.notnull}') @Size(min = 2,max = 10,message = '{student.name.length}') private String name; @Email(message = '{student.email.error}') private String email; @Max(value = 150,message = '{student.age.error}') private Integer age;...}

配置完成后,如果校驗(yàn)再出錯,就會展示我們自己的出錯信息了。

分組校驗(yàn)

由于校驗(yàn)規(guī)則都是定義在實(shí)體類上面的,但是,在不同的數(shù)據(jù)提交環(huán)境下,校驗(yàn)規(guī)則可能不一樣。例如,用戶的 id 是自增長的,添加的時候,可以不用傳遞用戶 id,但是修改的時候則必須傳遞用戶 id,這種情況下,就需要使用分組校驗(yàn)。

分組校驗(yàn),首先需要定義校驗(yàn)組,所謂的校驗(yàn)組,其實(shí)就是空接口:

public interface ValidationGroup1 {}public interface ValidationGroup2 {}

然后,在實(shí)體類中,指定每一個校驗(yàn)規(guī)則所屬的組:

public class Student { @NotNull(message = '{student.id.notnull}',groups = ValidationGroup1.class) private Integer id; @NotNull(message = '{student.name.notnull}',groups = {ValidationGroup1.class, ValidationGroup2.class}) @Size(min = 2,max = 10,message = '{student.name.length}',groups = {ValidationGroup1.class, ValidationGroup2.class}) private String name; @Email(message = '{student.email.error}',groups = {ValidationGroup1.class, ValidationGroup2.class}) private String email; @Max(value = 150,message = '{student.age.error}',groups = {ValidationGroup2.class}) private Integer age;...}

在 group 中指定每一個校驗(yàn)規(guī)則所屬的組,一個規(guī)則可以屬于一個組,也可以屬于多個組。

最后,在接收參數(shù)的地方,指定校驗(yàn)組:

@Controllerpublic class StudentController { @RequestMapping('/addstudent') @ResponseBody public void addStudent(@Validated(ValidationGroup2.class) Student student, BindingResult result) { if (result != null) { //校驗(yàn)未通過,獲取所有的異常信息并展示出來 List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError allError : allErrors) {System.out.println(allError.getObjectName()+':'+allError.getDefaultMessage()); } } }}

配置完成后,屬于 ValidationGroup2 這個組的校驗(yàn)規(guī)則,才會生效。

校驗(yàn)注解

@Null 被注解的元素必須為 null

@NotNull 被注解的元素必須不為 null

@AssertTrue 被注解的元素必須為 true

@AssertFalse 被注解的元素必須為 false

@Min(value) 被注解的元素必須是一個數(shù)字,其值必須大于等于指定的最小值

@Max(value) 被注解的元素必須是一個數(shù)字,其值必須小于等于指定的最大值

@DecimalMin(value) 被注解的元素必須是一個數(shù)字,其值必須大于等于指定的最小值

@DecimalMax(value) 被注解的元素必須是一個數(shù)字,其值必須小于等于指定的最大值

@Size(max=, min=) 被注解的元素的大小必須在指定的范圍內(nèi)

@Digits (integer, fraction) 被注解的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)

@Past 被注解的元素必須是一個過去的日期

@Future 被注解的元素必須是一個將來的日期

@Pattern(regex=,flag=) 被注解的元素必須符合指定的正則表達(dá)式

@NotBlank(message =) 驗(yàn)證字符串非 null,且長度必須大于0

@Email 被注解的元素必須是電子郵箱地址

@Length(min=,max=) 被注解的字符串的大小必須在指定的范圍內(nèi)

@NotEmpty 被注解的字符串的必須非空

@Range(min=,max=,message=) 被注解的元素必須在合適的范圍內(nèi)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 在线视频 91| 久草在线精品 | 免费a视频在线观看 | 亚洲欧洲视频在线观看 | 2021久久精品99精品久久 | 免费a级片在线观看 | 韩国美女丝袜一区二区 | 国产真实搭讪系列 | 在线日本三级 | 国内不卡1区2区 | 亚洲欧美日韩精品永久在线 | 久久亚洲精品国产精品777777 | 黄色一级片中国 | 妞干网免费在线视频 | 全黄一级裸片视频在线观看 | 国产成人一区二区三区视频免费蜜 | 国产在线观看自拍 | 女人被两根一起进3p在线观看 | 亚洲狠狠狠一区二区三区 | 看一级毛片国产一级毛片 | 国产三级在线观看a | 久久亚洲精品一区二区三区浴池 | 亚洲理论在线观看 | 草草影院ccyy免费看片 | 特别福利视频在线观看 | 美女一级a毛片免费观看 | 欧美黄成人免费网站大全 | 亚洲精品黄 | 国产小说 | jk美女伸开两腿让我爽视频 | 国内精品久久久久久西瓜色吧 | 久久在线视频播放 | 国产精品天仙tv在线观看 | 亚洲福利一区福利三区 | 国产性较精品视频免费 | 国产欧美一区二区三区鸳鸯浴 | 欧美亚洲日本国产 | 日本高清xxx | 亚洲精品欧美综合四区 | 美日韩在线观看 | 久久精品成人免费看 |