
校驗:非空、唯一性等校驗
密碼的加密:密碼加密來存儲。
如何做https的訪問
校驗
一個層面是接口層面,另外一個層面是數據庫層面。
Springboot給我們提供了簡單的封裝

校驗的包里面還有其他的注解。

IDEA里面鼠標選中按住Ctrl鍵盤直接跳到注解的包下面

然后在參數之前加上注解。@Validated 表示傳進來的這個UserInfo需要去做校驗

運行程序查看效果


詳細的錯誤信息

用戶名和密碼都去掉

返回的errors就是一個數組

{ "timestamp": "2019-12-11T08:34:27.894+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "NotBlank.userInfo.password", "NotBlank.password", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "userInfo.password", "password" ], "arguments": null, "defaultMessage": "password", "code": "password" } ], "defaultMessage": "密碼不能為空", "objectName": "userInfo", "field": "password", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "NotBlank.userInfo.username", "NotBlank.username", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "userInfo.username", "username" ], "arguments": null, "defaultMessage": "username", "code": "username" } ], "defaultMessage": "用戶名不能為空", "objectName": "userInfo", "field": "username", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" } ], "message": "Validation failed for object='userInfo'. Error count: 2", "path": "/users" }
postman里面的設置
Content-Type:application/json

{"name":"jojo","username":"","password":""}

數據庫層面的校驗
數據庫的實體類也要加上非空的注解。

因為傳進來的數據 經過Service層的業務邏輯,可以能會做一些修改后再保存到數據庫內,所以數據庫也要做校驗。
例如下面 接收的參數屬性拷貝到user對象后, 如果又設置了userName為null,那么保存插入的數據就會有問題。

@PostMapping
public UserInfo create(@RequestBody @Validated UserInfo info){
User user=new User();
BeanUtils.copyProperties(info,user);
user.setUsername(null);
userRepository.save(user);
info.setId(user.getId());
return info;
}

再次測試,用戶名和密碼都填好后。

返回的500,。是服務器內部處理的錯誤


{ "timestamp": "2019-12-11T08:47:21.469+0000", "status": 500, "error": "Internal Server Error", "message": "Validation failed for classes [com.imooc.security.user.User] during persist time for groups [javax.validation.groups.Default, ]\nList of constraint violations:[\n\tConstraintViolationImpl{interpolatedMessage='用戶名不能為null', propertyPath=username, rootBeanClass=class com.imooc.security.user.User, messageTemplate='用戶名不能為null'}\n]", "path": "/users" }
用戶名不能重復的問題、@Column注解里面。unique注解

數據庫內把表的username刪除掉。SpringBoot的項目啟動后,JPA會自動同步 User類的字段到數據庫內。發現缺少了username字段,就創建上。

JPA會自動同步你的對象和數據庫的表,但是他會去做判斷,如果你的數據庫內已經有了一個同名的字段username,他就不會再去改變數據庫已有的字段。我們把username刪掉了 他會重新去創建這個字段,並按照實體類的規則去創建。

啟動服務。日志內去創建了username這個字段。

保證用戶名的唯一性。

把數據庫庫內的數據清理一下 ,剩下一條用戶數據

把設置為空的這行代碼刪掉,。



{ "timestamp": "2019-12-11T08:56:55.356+0000", "status": 500, "error": "Internal Server Error", "message": "could not execute statement; SQL [n/a]; constraint [UK_sb8bbouer5wak8vyiiy4pf2bx]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement", "path": "/users" }
這個就是數據庫的常見的校驗
@NotBlank和nullable設置為true這兩個的區別。
@NotBlank這是應用級,框架層面的校驗,不管你數據庫底層數據庫字段是空的還是非空的,在應用層面他都回去做校驗。sql執行之前去做校驗。
@Column的nullable是在建數據庫的時候,把這列設置為非空了。就是數據庫內這個字段不能為空

如果去掉了nullable那么數據庫內是可為空的。只不過NotBlank會在框架層面去校驗非空

結束
