Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом учебнике – мы продолжаем текущий Регистрация в весеннем совете серия с нетерпением на повторное подтверждение ссылку на пользователя в случае, если он истекает, прежде чем они имеют возможность активировать свою учетную запись.
2. Повторное подтверждение ссылки
Во-первых, давайте посмотрим, что происходит, когда пользователь запрашивает другую ссылку проверки , в случае, если предыдущий истек.
Во-первых – мы сбросим существующий токен с новым срок действия . Мы отправим пользователю новое письмо с новой ссылкой/токеном:
@GetMapping("/user/resendRegistrationToken") public GenericResponse resendRegistrationToken( HttpServletRequest request, @RequestParam("token") String existingToken) { VerificationToken newToken = userService.generateNewVerificationToken(existingToken); User user = userService.getUser(newToken.getToken()); String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); SimpleMailMessage email = constructResendVerificationTokenEmail(appUrl, request.getLocale(), newToken, user); mailSender.send(email); return new GenericResponse( messages.getMessage("message.resendToken", null, request.getLocale())); }
И утилита для фактического создания сообщения электронной почты пользователь получает – constructResendVerificationTokenEmail() :
private SimpleMailMessage constructResendVerificationTokenEmail (String contextPath, Locale locale, VerificationToken newToken, User user) { String confirmationUrl = contextPath + "/regitrationConfirm.html?token=" + newToken.getToken(); String message = messages.getMessage("message.resendToken", null, locale); SimpleMailMessage email = new SimpleMailMessage(); email.setSubject("Resend Registration Token"); email.setText(message + " rn" + confirmationUrl); email.setFrom(env.getProperty("support.email")); email.setTo(user.getEmail()); return email; }
Нам также необходимо изменить существующую функциональность регистрации, добавив некоторую новую информацию о модели об истечении срока действия токена :
@GetMapping("/registrationConfirm") public String confirmRegistration( Locale locale, Model model, @RequestParam("token") String token) { VerificationToken verificationToken = userService.getVerificationToken(token); if (verificationToken == null) { String message = messages.getMessage("auth.message.invalidToken", null, locale); model.addAttribute("message", message); return "redirect:/badUser.html?lang=" + locale.getLanguage(); } User user = verificationToken.getUser(); Calendar cal = Calendar.getInstance(); if ((verificationToken.getExpiryDate().getTime() - cal.getTime().getTime()) <= 0) { model.addAttribute("message", messages.getMessage("auth.message.expired", null, locale)); model.addAttribute("expired", true); model.addAttribute("token", token); return "redirect:/badUser.html?lang=" + locale.getLanguage(); } user.setEnabled(true); userService.saveRegisteredUser(user); model.addAttribute("message", messages.getMessage("message.accountVerified", null, locale)); return "redirect:/login.html?lang=" + locale.getLanguage(); }
3. Обработчик исключений
Предыдущая функциональность, при определенных условиях – бросали исключения; эти исключения должны быть обработаны, и мы собираемся сделать это с пользовательский обработчик исключений :
@ControllerAdvice public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @Autowired private MessageSource messages; @ExceptionHandler({ UserNotFoundException.class }) public ResponseEntity
Обратите внимание, что:
- мы использовали @ControllerAdvice аннотация для обработки исключений по всему приложению
- мы использовали простой объект ОбщиеОтветы для отправки ответа:
public class GenericResponse { private String message; private String error; public GenericResponse(String message) { super(); this.message = message; } public GenericResponse(String message, String error) { super(); this.message = message; this.error = error; } }
4. Изменить badUser.html
Теперь мы изменим badUser.html позволяя пользователю получить новую ПроверкаТокен только в том случае, если срок действия их токена истек:
bad user error
signupresend
Обратите внимание, что мы использовали некоторые очень основные JavaScript и J’query здесь для обработки ответа “/пользователя/resendRegistrationToken” и перенаправить пользователя на его основе.
5. Заключение
В этой быстрой статье мы позволили пользователю запросить новую ссылку проверки для активации их учетной , в случае, если старый истек.
полная реализация этого учебника можно найти в проект github – это проект на основе Eclipse, поэтому он должен быть легким для импорта и запуска, как она есть.