【问题标题】:Spring MVC-Activation account by token-confirm account method return 404 errorSpring MVC-Activation account by token-confirm account方法返回404错误
【发布时间】:2019-08-05 09:42:26
【问题描述】:

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

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

  • 所以现在我有了这个:
    -用户注册新帐户(验证等)
    -用户在确认激活电子邮件已发送到他的电子邮件地址时重定向到站点
    -在数据库中,我在用户和他的令牌之间建立了正确的连接
    -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";
    }

}

谢谢!

【问题讨论】:

  • 您要调用哪个网址/add?另一个应该是完全相同的,而不是/add 它应该是/confirm-account(假设这两种方法都在同一个控制器中!)。
  • 我的上帝...就是这样...我只是将它放在具有 /user 地址的控制器中...现在与 localhost:8080/user/confirm 的确认链接正在工作!谢谢!我简直不敢相信!
  • 只需使用构建器,这样可以防止您出现此类错误。
  • 非常感谢!它节省了我的一天!现在我肯定会使用它:D

标签: spring hibernate maven tomcat


【解决方案1】:

我怀疑http://localhost:8080/confirm-account?token=5e5aad4f-90c4-4f83-8f58-83b66d63659f 是实际的 URL。除非您的应用程序在您的应用程序服务器中部署为 ROOT。它可能应该类似于http://localhost:8080/&lt;app-name-version&gt;/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

【讨论】:

  • 这个构建器会很棒,谢谢。但我将根链接从 更改为 localhost:8080/ - 所以我认为这不是问题。
  • 使用构建器,即使是为了防止出现问题。 404 是一个明确的信号,表明您的 URL simlu 不匹配。因此,要么您没有使用正确的 URL 并且没有更改映射,要么您错过了 URL 中的某些 servlet 映射部分,具体取决于您的 DispatcherServlet 的映射方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2018-12-08
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多