Spring MVC激活帐户通过令牌确认帐户方法返回404错误

时间:2019-03-14 13:12:40

标签: spring hibernate maven tomcat

我正在使用Spring,Hibernate,MVC,Maven和Tomcat构建应用程序。 我完成了本教程中的所有操作:

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

  • 现在我有了这个:
    -用户注册新帐户(验证等)
    -用户在确认已将激活电子邮件发送到他的电子邮件地址时重定向到站点
    -in数据库中,用户和他的令牌之间已正确连接
    -i正确接收带有唯一令牌的电子邮件,如下所示:

您好! 要激活您的帐户,请点击下面的链接
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 :(得分:0)

我怀疑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来简化生活,而不是使用UriComponentsBuilder concat来构造URL。

类似这样的事情。

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

然后使用此url将其添加到您的电子邮件文本中,而不是对其中的URL进行硬编码。

注意:,除了自己创建UriComponentsBuilder之外,您还可以将其添加为请求处理方法的参数。