验证有两个阶段-MVC层和JPA层。如果对两个层使用相同的模型类,则不能对两个不同的对象使用相同的字段。
在我的项目中,我为注册表单字段添加了一些验证。当点击提交按钮密码验证时,不会像@AAAzzz123
那样检查原始密码,而是像$2a$10$kUm6AxxH3SNSIoUtP6V7WOlFTIORTOILKDFGOP
那样检查编码密码,并产生验证错误消息。下面是我的密码。
实体
public class User {
...
...
...
@Pattern(regexp = "(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$")
private String password;
}
控制器
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String resiterUser(@Valid @ModelAttribute("user") User user,
BindingResult result)
{
if(result.hasErrors())
{
return "signup";
}
// Problem is here
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepo.save(user);
return "redirect:/";
}
查看
<form th:action="@{/register}" method="post">
<div class="form-outline mb-4">
<label class="form-label" for="form3Example4cg">Password</label>
<input type="password"
th:classappend="${#fields.hasErrors('password') ? 'is-invalid' : ''}"
class="form-control form-control-lg"
name="password" />
<div id="validation" class="text-danger" th:each="e: ${#fields.errors('password')}" th:text=${e}>
</div>
</div>
<div class="d-flex">
<button type="submit" class="btn bg-primary">Submit</button>
</div>
</form>
你可以这样分开它们,例如:
@Entity
@Table(name = "USER")
public class User {
@Column(name = "password")
@Pattern(regexp = "^\$2[aby]\$.{56}$")
private String encodedPassword
// for form binding only
private transient String newPassword;
}
user.setEncodedPassword(bCryptPasswordEncoder.encode(user.getNewPassword()));