Spring Rest 控制器为 POST 请求返回 302(已找到),但没有任何反应

问题描述 投票:0回答:1

我是后端开发和 Spring Boot 的初学者,目前正在开发一个项目,以更好地熟悉基础知识。我正在编写一个简单的 UI 用于用户身份验证和注册,并将凭据保存在 MySQL 数据库中。

在注册页面(由电子邮件、用户名、密码组成)中,当我单击“注册”(并提交表单)时,我被重定向回登录页面(如预期),但没有其他任何反应。我收到了 302,我可以在 Chrome 的开发工具中看到它。我的数据库中没有任何反应,当我在 POST 请求的方法中放置断点时,它不会停止在那里,就好像我没有真正按照我的预期调用它一样。

我有一个 RegisterController 类来创建 ModelAttribute 并返回相关的 HTML:

@Controller
public class RegisterController {
    @GetMapping("/register")
    public String showRegisterPage(Model model){
        model.addAttribute("user", new User());
        return "register";
    }
}

我有一个 HTML 页面来创建表单、填充属性并将表单提交到 POST 请求端点 (/users/save)。这是相关部分:

<div class="container">
    <p>Register a new user</p>
    <form action="#" th:action="@{/users/save}" th:object="${user}" method="POST">
        <input type="email" th:field="*{email}" placeholder="Email">
        <input type="text" th:field="*{username}" placeholder="Username">
        <input type="password" th:field="*{hashedPassword}" placeholder="Password">
        <button type="submit">Register</button>
    </form>
    <br>
    <a th:href="@{/login}">Back to login page</a>
</div>

最后,我有一个 UserRestController 类来处理 POST API 请求:

@RestController("/users")
public class UserRestController {

    private final UserService userService;

    @Autowired
    public UserRestController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping("/save")
    public String saveUser(@ModelAttribute("user") User user){
        userService.save(user);
        return "redirect:/login";
    }

}

我尝试咨询 Copilot,了解到默认情况下 Spring Security 可能会阻止 POST 请求以防止 CSRF 攻击。然后我尝试使用

http.csrf().disable()
在我的安全配置类中禁用 csrf,但这已被弃用。我还尝试在我的表单中包含 CSRF 令牌,方法是向其中添加另一个输入:

<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>

但这也不起作用。

我还尝试在 POST 请求的方法中使用

@RequestBody
而不是
@ModelAttribute
:

@PostMapping("/save")
public String saveUser(@RequestBody User user)

但这也失败了。

这可能是显而易见的,但我也尝试在 POST 请求的方法中放置一个断点。 IDE根本没有停止,就好像没有断点一样。我不知道如何解决这个问题。

java spring-boot spring-security backend server-side
1个回答
0
投票

你的api不起作用的原因是路由,你应该在@RequestMapping注释中声明正确的路由,而不是在@RestController中

@RestController
@RequestMapping(path="/users")
public class UserRestController {}

虽然这对你有用,但我认为另一件事可能是多余的,那就是 @ModelAttribute("user"),你可以省略它,它仍然对你有用,或者你可以使用 @RequestBody 代替

@PostMapping("/save")
public String saveUser(User user){
    userService.save(user);
    return "redirect:/login";
}

从本教程开始https://spring.io/guides/tutorials/rest

© www.soinside.com 2019 - 2024. All rights reserved.