我有一种Controler方法,该方法从用户可以使用的表单中接收电子邮件地址,例如,如果用户丢失了密码或在注册后未收到验证电子邮件,则可以使用。
因此,当用户从控制器方法提交表单时,请检查电子邮件是否有效。我还创建了一个自定义验证器,以检查数据库中是否存在电子邮件。因此,验证器执行选择,如果查询什么都不返回,则返回false。我认为这样做很方便,但这是个好主意吗?常见的做法?
@PostMapping({"/password/forgot"})
public ModelAndView passwordForgot(@ModelAttribute("email")
@Valid
@RequestBody EmailDto email,
BindingResult result,
WebRequest request,
Errors errors) {
if (!result.hasErrors()) {
//send the email
}
return new ModelAndView("passwordForgot", "email", email);
}
通过电子邮件发送DTO
@NoArgsConstructor
@Getter
@Setter
public class EmailDto {
@NotNull
@NotEmpty
@Email
@EmailExist
private String email;
}
通过电子邮件发送验证器
@Target({TYPE, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = EmailExistValidator.class)
@Documented
public @interface EmailExist {
String message() default "{email.not.exist}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class EmailExistValidator implements ConstraintValidator<EmailExist, String> {
@Autowired
private AuthPersonRepository personRepository;
@Override
public void initialize(EmailExist constraintAnnotation) { }
@Override
public boolean isValid(String email, ConstraintValidatorContext context){
AuthPerson person = personRepository.findByEmail(email);
return person != null;
}
}