我是后端开发和 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根本没有停止,就好像没有断点一样。我不知道如何解决这个问题。
你的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";
}