为什么我的浏览器在本应发送 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}">
我正在开发一个使用 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}">