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

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

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

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

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

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

普通校驗

普通校驗,是這里最基本的用法。

首先,我們需要加入校驗需要的依賴:

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

接下來,在 SpringMVC 的配置文件中配置校驗的 Bean:

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

配置時,提供一個 LocalValidatorFactoryBean 的實例,然后 Bean 的校驗使用 HibernateValidator。

這樣,配置就算完成了。

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

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

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

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 中定義接口:

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

在這里:

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

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

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

由于 properties 文件中的中文會亂碼,所以需要我們先修改一下 IDEA 配置,點
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 文件,內容如下:

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

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

<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"/>

最后,在實體類上,加上校驗出錯時的消息

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;
...
}

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

分組校驗

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

分組校驗,首先需要定義校驗組,所謂的校驗組,其實就是空接口:

public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}

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

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

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

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

校驗注解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 如何在Java中獲取當前年份(實例代碼)

    如何在Java中獲取當前年份(實例代碼)

    在Java語言中獲取當前年份有幾種方法:使用java.util包下的Calendar類,使用java.time包下的LocalDate類或者使用java.text包下的SimpleDateFormat類,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2023-11-11
  • SpringBoot響應出現(xiàn)中文亂碼的解決方法

    SpringBoot響應出現(xiàn)中文亂碼的解決方法

    這篇文章主要介紹了SpringBoot響應出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作有一定的參考價值,需要的朋友們下面隨著小編來一起來學習吧
    2024-02-02
  • maven項目test執(zhí)行main找不到資源文件的問題及解決

    maven項目test執(zhí)行main找不到資源文件的問題及解決

    這篇文章主要介紹了maven項目test執(zhí)行main找不到資源文件的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中Calendar.add()方法的使用

    java中Calendar.add()方法的使用

    本文主要介紹了java中Calendar.add()方法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 淺析Java單例設計模式(自寫demo)

    淺析Java單例設計模式(自寫demo)

    Java單例模式是看起來以及用起來簡單的一種設計模式,但是就實現(xiàn)方式以及原理來說,也并不淺顯,下面這篇文章主要給大家詳細介紹了Java中單例模式,需要的朋友可以參考下
    2021-12-12
  • JavaWeb利用struts實現(xiàn)文件下載時改變文件名稱

    JavaWeb利用struts實現(xiàn)文件下載時改變文件名稱

    這篇文章主要為大家詳細介紹了JavaWeb利用struts實現(xiàn)文件下載時改變文件名稱的相關資料,需要的朋友可以參考下
    2016-06-06
  • Java設計模式--代理模式

    Java設計模式--代理模式

    代理就是一個人或者一個機構代表另一個人或者另一個機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之前起到中介的作用
    2021-07-07
  • Java?Redisson多策略注解限流

    Java?Redisson多策略注解限流

    這篇文章主要介紹了Java?Redisson多策略注解限流,文章使用Redisson的RRateLimiter進行限流,詳細介紹,感興趣的小伙伴可以參考下面文章內容
    2022-09-09
  • SpringBoot項目整合Redis教程詳解

    SpringBoot項目整合Redis教程詳解

    這篇文章主要介紹了SpringBoot項目整合Redis教程詳解,Redis?是完全開源的,遵守?BSD?協(xié)議,是一個高性能的?key-value?數(shù)據(jù)庫。感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • java Object轉byte與byte轉Object方式

    java Object轉byte與byte轉Object方式

    這篇文章主要介紹了java Object轉byte與byte轉Object方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

古浪县| 武川县| 刚察县| 昆山市| 宜宾县| 雷山县| 开化县| 顺义区| 南溪县| 泸溪县| 余庆县| 襄垣县| 游戏| 绥滨县| SHOW| 平度市| 永修县| 客服| 湖州市| 邵阳市| 莱芜市| 海晏县| 青神县| 苍南县| 错那县| 株洲市| 九江市| 开化县| 澄江县| 汕头市| 敦煌市| 东源县| 普定县| 龙游县| 刚察县| 兴安盟| 荥阳市| 拜城县| 东丰县| 泗洪县| 通海县|