欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年09月23日 10:07:04   作者:柒  
這篇文章主要介紹了Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

B/S 系統(tǒng)中對(duì)http 請(qǐng)求數(shù)據(jù)的校驗(yàn)多數(shù)在客戶(hù)端進(jìn)行,這也是出于簡(jiǎn)單及用戶(hù)體驗(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)??這需要理解客戶(hù)端校驗(yàn)和服務(wù)端校驗(yàn)各自的目的。

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

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

普通校驗(yàn)

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

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

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

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

<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validatorFactoryBean">
  <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean>
<mvc:annotation-driven validator="validatorFactoryBean"/>

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

這樣,配置就算完成了。

接下來(lái),我們提供一個(gè)添加學(xué)生的頁(yè)面:

<form action="/addstudent" method="post">
  <table>
    <tr>
      <td>學(xué)生編號(hào):</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é)生編號(hào)不能為空,學(xué)生姓名長(zhǎng)度不能超過(guò) 10 且不能為空,郵箱地址要合法,年齡不能超過(guò) 150。那么在定義實(shí)體類(lèi)的時(shí)候,就可以加入這個(gè)判斷條件了。

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 表示這個(gè)字段不能為空
  • @Size 中描述了這個(gè)字符串長(zhǎng)度的限制
  • @Email 表示這個(gè)字段的值必須是一個(gè)郵箱地址
  • @Max 表示這個(gè)字段的最大值

定義完成后,接下來(lái),在 Controller 中定義接口:

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

在這里:

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

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

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

由于 properties 文件中的中文會(huì)亂碼,所以需要我們先修改一下 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

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

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

接下來(lái),在 SpringMVC 配置中,加載這個(gè)配置文件:

<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validatorFactoryBean">
  <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
  <property name="validationMessageSource" ref="bundleMessageSource"/>
</bean>
<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 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í)體類(lèi)上,加上校驗(yàn)出錯(cuò)時(shí)的消息

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)再出錯(cuò),就會(huì)展示我們自己的出錯(cuò)信息了。

分組校驗(yàn)

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

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

public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}

然后,在實(shí)體類(lèi)中,指定每一個(gè)校驗(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 中指定每一個(gè)校驗(yàn)規(guī)則所屬的組,一個(gè)規(guī)則可以屬于一個(gè)組,也可以屬于多個(gè)組。

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

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

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

校驗(yàn)注解

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

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

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

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

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

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

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

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

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

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

@Past 被注解的元素必須是一個(gè)過(guò)去的日期

@Future 被注解的元素必須是一個(gè)將來(lái)的日期

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

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

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

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟

    SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟

    在Spring Boot配置文件中設(shè)置屬性時(shí),除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機(jī)值和參數(shù)間引用對(duì)屬性值進(jìn)行設(shè)置。下面給大家介紹SpringBoot參數(shù)間引用隨機(jī)數(shù)設(shè)置的操作步驟,感興趣的朋友一起看看吧
    2021-06-06
  • Spring Boot jpa Service層代碼實(shí)例

    Spring Boot jpa Service層代碼實(shí)例

    這篇文章主要介紹了Spring Boot jpa Service層代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 記一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請(qǐng)求異常的解決辦法

    記一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請(qǐng)求異常的解決辦法

    Knife4j是一個(gè)集Swagger2 和 OpenAPI3為一體的增強(qiáng)解決方案,下面這篇文章主要給大家介紹了關(guān)于一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請(qǐng)求異常的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • JVM的GC日志及運(yùn)行參數(shù)解讀

    JVM的GC日志及運(yùn)行參數(shù)解讀

    這篇文章主要為大家介紹了JVM的GC日志及運(yùn)行參數(shù)解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • java實(shí)現(xiàn)圖片文字識(shí)別ocr

    java實(shí)現(xiàn)圖片文字識(shí)別ocr

    這篇文章主要介紹了java實(shí)現(xiàn)圖片文字識(shí)別ocr ,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-08-08
  • JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的方法詳解

    JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的方法詳解

    這篇文章主要介紹了JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • 大廠禁止SpringBoot在項(xiàng)目使用Tomcat容器原理解析

    大廠禁止SpringBoot在項(xiàng)目使用Tomcat容器原理解析

    這篇文章主要為大家介紹了大廠禁止SpringBoot在項(xiàng)目使用Tomcat原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • springboot分布式整合dubbo的方式

    springboot分布式整合dubbo的方式

    Dubbo是一款高性能、輕量級(jí)的開(kāi)源Java RPC框架,本文通過(guò)實(shí)例代碼給大家介紹springboot分布式整合dubbo的方式,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • java計(jì)算日期相差天數(shù)的4種簡(jiǎn)單方法舉例

    java計(jì)算日期相差天數(shù)的4種簡(jiǎn)單方法舉例

    最近在工作中遇見(jiàn)一個(gè)小需求,要求計(jì)算兩個(gè)日期之間相差幾天,下面這篇文章主要給大家介紹了關(guān)于java計(jì)算日期相差天數(shù)的4種簡(jiǎn)單方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Spring @Component自定義注解實(shí)現(xiàn)詳解

    Spring @Component自定義注解實(shí)現(xiàn)詳解

    @Component是一個(gè)元注解,意思是可以注解其他類(lèi)注解,如@Controller @Service @Repository @Aspect。官方的原話(huà)是:帶此注解的類(lèi)看為組件,當(dāng)使用基于注解的配置和類(lèi)路徑掃描的時(shí)候,這些類(lèi)就會(huì)被實(shí)例化
    2022-09-09

最新評(píng)論