为什么我的浏览器在本应发送 POST 请求 [Spring-Boot] 的表单上发送 GET 请求?

Why does my browser send a GET request on a form where it should be sending a POST request[Spring-Boot]?

我正在开发一个使用 Spring Boot MVC 的应用程序,我有一个登录页面,每当我使用 chrome 在表单上输入数据时,我的浏览器都不会将我重定向到我的页面在我的控制器 class 中指定,但它在应该发送 POST 请求的地方发送 GET 请求。这是我的控制器class

@Controller
@RequestMapping("/login")
public class loginController {
private final AuthService authService;

public loginController(AuthService authService) {
    this.authService = authService;
}

@GetMapping
public String returnLogIn() {
    return "login";
}

@PostMapping
public String login(@RequestParam String username, @RequestParam String password, Model model, HttpServletRequest request) {

    User user = null;
    try {
        user = this.authService.login(username, password);
        model.addAttribute("User", user);
        request.getSession().setAttribute("user",user);
        return "redirect:/home";
    } catch (InvalidArgumentsException exception) {

        model.addAttribute("hasError", true);
        model.addAttribute("error", exception.getMessage());
        return "login";
    }
}
}

如您所见,如果登录成功,那么我应该被重定向到主页,但没有发生,我再次被重定向到登录页面,所有变化都是其中的 URL附加了我给出的参数。但是当我使用 POSTMAN 时,一切正常,发送了一个 POST 请求,我被重定向到 /home 页面,就像我在控制器 class 中指定的那样。但是我不知道为什么当我使用 chrome 时不会发生这种情况。每次我做一个小改动都必须使用 POSTMAN 真的很耗时。这也是 HTML 形式

           <form id="form-id" th:method="POST" th:action="@{/login}">
            <div class="mb-3">
                <input  type="text" class="form-control" name="username" id="username"  
            aria-describedby="emailHelp"
                       placeholder="User Name">
            </div>
            <div class="mb-3">
                <input type="password" class="form-control" name="password" 
           id="password" placeholder="Password">
            </div>
            <!-- TODO use hasError set it in the model -->
            <div th:if="${hasError}">
            <span class="error text-danger" th:text="${error}"></span>
            </div>

            <div class="text-center"><button type="submit" class="btn btn-color px-5 mb- 
            5 w-100 btn btn-dark" >Login</button></div>
            </form>

我不认为我的代码有什么问题,因为当我使用 POSTMAN 时一切正常,但我真的不知道为什么当我使用我的浏览器时它不起作用。 Javascript 在我的浏览器中启用了我真的不知道问题出在哪里。我也尝试将 POST 请求映射到不同的 URL 但我仍然遇到同样的问题。 我真的不知道似乎是什么问题

如前所述,我无法使用 chrome 发送 POST 请求,但使用 POSTMAN 一切正常。

GET request instead of POST - 正如您所看到的,GET 请求正在代替它应该是 POST 请求,这里使用 Postman 一切正常,我被重定向到主页: Postman request 我真的不知道该怎么办,因为我需要用户的会话,所以无法继续进行该项目 我还在 gitlab 上上传了项目,你可以在这里找到它: https://gitlab.com/nisizenuni/betstar

在 spring 表单中使用 POST 时,您从表单传递的值不会作为查询参数传递。当您以某种形式使用 GET 方法操作时会发生这种情况。

所以这就是邮递员工作但您的前端无法与后端结合使用的原因。在邮递员中,您可以在手动定义请求参数时正确发送请求,因此控制器可以正确地为请求提供服务。但是,您的前端不会将值作为查询参数发送,因此您的控制器无法正确处理请求。

您可以通过进行以下更改来纠正此问题。

首先创建一个简单的 DTO 对象,其中 Spring 可以绑定传递的值,这些值到达 JSON 请求的主体。

public class UserInfo {

  private String userame;
  private String password;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

} 

然后你可以定义你的控制器为

@PostMapping
public String login(@ModelAttribute UserInfo userInfo, Model model, HttpServletRequest request) {

String username = userInfo.getUsername();
String password = userInfo.getPassword();

.... same as the existing controller that you have

}

同样在前端中,您需要将表单定义为

<form id="form-id" th:method="POST" th:action="@{/login}" th:object="${userInfo}">