Spring MVC-Активация учетной записи с помощью токена-подтверждения метода возврата 404 ошибка - PullRequest
0 голосов
/ 14 марта 2019

Я создаю приложение с помощью Spring, Hibernate, MVC, Maven и Tomcat.Я сделал все как в этом уроке:

https://stackabuse.com/spring-security-email-verification-registration/

  • Так что теперь у меня есть это:
    -пользователь зарегистрирует новую учетную запись (проверка и т. Д.)
    -пользовательское перенаправлениена сайт, когда подтверждается, что электронное письмо активации отправлено на его адрес электронной почты
    - в базе данных у меня правильно установлена ​​связь между пользователем и его токеном
    - я получаю электронное письмо с уникальным токеном, подобным этому:

Привет, пользователь !!Чтобы активировать свой аккаунт, нажмите ссылку ниже
http://localhost:8080/confirm-account?token=5e5aad4f-90c4-4f83-8f58-83b66d63659f

Но когда я копирую и вставляю эту ссылку (я не знаю, почему у меня нет только ссылки, я думаю, что это сейчас не важно), я получил ошибку 404Так же, как у api нет этого адреса.

А теперь я покажу вам мой контроллер с регистрацией и подтверждением аккаунта

 @PostMapping("/add")
public String addUser(@ModelAttribute @Valid User user, Model model, BindingResult bindingResult, HttpServletRequest request) throws MessagingException {


    User user1 = userRepository.findByEmail(user.getEmail());
    User user2 = userRepository.findByUsername(user.getUsername());

    if (user1 != null) {
        bindingResult.rejectValue("email", "error.email", "Jest juz taki email w bazie!");

        return "register_user";

    }
    if (user2 != null) {

        bindingResult.rejectValue("username", "username.error", "Ta nazwa jest w użyciu");

        return "register_user";
    } else if (bindingResult.hasErrors()) {

        return "register_user";

    } else {

        userRepository.save(user);

        ConfirmationToken confirmationToken = new ConfirmationToken(user);

        confirmationTokenRepository.save(confirmationToken);


        emailSender.sendMail(user.getEmail(),"Konto w serwisie","<b>Witaj " + " "+ user.getFirstName()+"!</b>" +"<br> Dokonałeś rejestracji!" +
                "<br>Aby dokończyc proces musisz kliknąć w link który znajduje się poniżej:<br> "
        + "http://localhost:8080/confirm-account?token=" + confirmationToken.getConfirmationToken());

        model.addAttribute("confirmationMessage", "Pomyślnie utworzyłeś konto!Potwierdzenie wysłane na adres" + user.getEmail());

        return "success";
    }
}

И подтверждение

 @RequestMapping(value="/confirm-account", method= {RequestMethod.GET, RequestMethod.POST})
public String confirmUserAccount(Model model, @RequestParam("token")String confirmationToken)
{
    ConfirmationToken token = confirmationTokenRepository.findByConfirmationToken(confirmationToken);

    if(token != null)
    {
        User user = userRepository.findByEmail(token.getUser().getEmail());
        user.setEnabled(true);
        userRepository.save(user);

        return "accountVerified";
    }
    else
    {
        model.addAttribute("message", "The link is invalid or broken!");
        return "error";
    }

}

Спасибо!

1 Ответ

0 голосов
/ 14 марта 2019

Я сомневаюсь, что http://localhost:8080/confirm-account?token=5e5aad4f-90c4-4f83-8f58-83b66d63659f является фактическим URL. Если ваше приложение не развернуто как ROOT на вашем сервере приложений. Вероятно, это должно быть что-то вроде http://localhost:8080/<app-name-version>/confirm-account?token=5e5aad4f-90c4-4f83-8f58-83b66d63659f.

Вместо использования String concat для создания URL, я настоятельно рекомендую использовать UriComponentsBuilder, чтобы сделать вашу жизнь проще.

Как то так.

String url = UriComponentsBuilder.fromHttpRequest(request)
                 .path("/confirm-account");
                 .queryParam("token", confirmationToken.getConfirmationToken()).toUriString();

Затем используйте этот url, чтобы добавить его в текст своей электронной почты, вместо того, чтобы жестко задавать URL-адрес.

ПРИМЕЧАНИЕ: вместо создания UriComponentsBuilder самостоятельно, вы также можете добавить его в качестве аргумента метода обработки запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...