【问题标题】:Using Posting a form with Spring Boot and Thymleaf incorrectly uses GET method instead of POST使用 Spring Boot 和 Thymeleaf 发布表单错误地使用 GET 方法而不是 POST
【发布时间】:2020-11-09 21:01:37
【问题描述】:

我正在学习 Spring Boot 并尝试实现身份验证。我有一个注册页面,它使用 POST 方法发送新的用户数据以存储在内存数据库中。正在发生的奇怪事情是,当我提交表单时,GET 方法是唯一被调用的方法。这是我的 HTML 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Signup</title>
</head>
<body>
    <div class="container justify-content-center w-25 p-3" style="background-color: #eeeeee; margin-top: 5em;">
        <div class="form-group">
            <label><a th:href="@{/login}">Back to Login</a></label>
        </div>

        <h1 class="display-5">Sign Up</h1>
        <form action="#" th:action="@{/signup}" methond="POST">
            <div id="success-msg" th:if="${signupSuccess}">
                You successfully signed up! Please continue to the <a id="login-ling" th:href="@{/login}">login</a> page.
            </div>
            <div if="error-msg" th:if="${signupError}">
                <span th:text="${signupError}"></span>
            </div>
            <div class="form-row">
                <div class="form-group col-md-6">
                    <label for="inputFirstName">First Name</label>
                    <input type="input" name="firstName" class="form-control" id="inputFirstName" placeholder="Enter First Name" maxlength="20" required>
                </div>
                <div class="form-group col-md-6">
                    <label for="inputLastName">Last Name</label>
                    <input type="input" name="lastName" class="form-control" id="inputLastName" placeholder="Enter Last Name" maxlength="20" required>
                </div>
            </div>
            <div class="form-row">
                <div class="form-group col-md-6">
                    <label for="inputUsername">Username</label>
                    <input type="input" name="username" class="form-control" id="inputUsername" placeholder="Enter Username" maxlength="20" required>
                </div>
                <div class="form-group col-md-6">
                    <label for="inputPassword">Password</label>
                    <input type="password" name="password" class="form-control" id="inputPassword" placeholder="Enter Password" maxlength="20" required>
                </div>
            </div>
            <button id="submit-button" type="submit" class="btn btn-primary">Sign Up</button>
        </form>
    </div>
</body>
</html>

如您所见,我在表单上有 method="POST" 属性。

这是我的注册控制器:

import com.udacity.mvc.Basics.models.User;
import com.udacity.mvc.Basics.services.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller()
@RequestMapping("/signup")
public class SignupController {

    private final UserService userService;

    public SignupController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping()
    public String signupView() {
        System.out.println("Get");
        return "signup";
    }

    @PostMapping()
    public String signupUser(@ModelAttribute User user, Model model) {
        String signupError = null;
        System.out.println("Post");
        if (!userService.usUsernameAvailable(user.getUsername())) {
            signupError = "The username already exist.";
        }

        if (signupError == null) {
            int rowsAdded = userService.createUser(user);
            if(rowsAdded < 0) {
                signupError = "There was an error signing you up. Please try again";
            }
        }

        if (signupError == null) {
            model.addAttribute("signupSuccess", true);
        } else {
            model.addAttribute("signupError", signupError);
        }

        return"signup";
    }
}

我已将System.out.println("GET") 放在@GetMapping() 方法中,并且可以在我的服务器上看到该方法被调用,即使我点击了注册表单上的提交按钮。有人知道为什么会这样吗?

【问题讨论】:

  • 你有methond="POST"
  • 很棒的收获。谢谢一百万

标签: java spring spring-boot spring-security thymeleaf


【解决方案1】:

在html文件中,'method'关键字有拼写错误 将该行替换为:

&lt;form th:action="@{/signup}" method="POST"&gt;

去掉action="#",就可以了

【讨论】:

    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 2017-06-04
    • 2018-07-08
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多