Spring MVC使get和post方法混淆了相同的请求映射

时间:2015-05-26 04:46:21

标签: spring-mvc spring-boot

我有一个登录控制器,我已将“/ login”路径映射到两种不同的方法。一个将被要求获得,另一个将被发布。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(Model model){
    LoginDto loginDto = new LoginDto();
    model.addAttribute("loginDto", loginDto);
    return "home/login";
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLogin(@Valid LoginDto loginDto, BindingResult bindingResult){
    if(bindingResult.hasErrors()){
        return "home/login";
    }
    return "redirect:/";
}

我有百里香的形式

<form method="POST" th:action="@{/login}" th:object="${loginDto}">
    <div class="form-group-row">
        <label> Email </label>
        <input type = "text" th:field = "*{email}"/>
        <span th:if="${#fields.hasErrors('email')}" th:errors = "*{email}"></span>
    </div>
    <div>
        <label> Password </label>
        <input type = "text" th:field = "*{password}"/>
    </div>
    <input type="submit" />
</form>

输入数据并单击“提交”时,将调用带有GET请求的方法。我通过在两种方法中插入断点来了解这一点。此外,url现在还有一个错误。我也将url映射到第二种方法改为“doLogin”,就像这样

@RequestMapping(value = "/dologin", method = RequestMethod.POST)
public String doLogin(@Valid LoginDto loginDto, BindingResult bindingResult){
    if(bindingResult.hasErrors()){
        return "home/login";
    }
    return "redirect:/";
}

并将表单更改为此

<form method="POST" th:action="@{/dologin}" th:object="${loginDto}">
    <div class="form-group-row">
        <label> Email </label>
        <input type = "text" th:field = "*{email}"/>
        <span th:if="${#fields.hasErrors('email')}" th:errors = "*{email}"></span>
    </div>
    <div>
        <label> Password </label>
        <input type = "text" th:field = "*{password}"/>
    </div>
    <input type="submit" />
</form>

它有效。我可以输入数据并点击提交按钮,我在doLogin方法中。但是,我想将GET和POST的映射保持为相同的URL,以根据请求方法执行不同的操作。

此外,当我首先创建表单时,我忘了指定method =“post”,并在测试时将提交的请求从此表单获取到“/ login”。也许那些需要解开的东西需要解开。

这是一个错误吗?我可以使用不同的请求方法将相同的URL映射到其他控制器方法,但是这个似乎不想工作。任何想法?

1 个答案:

答案 0 :(得分:1)

我已经弄清楚了。映射到POST请求的方法的原因是因为我使用的是spring安全性而且它没有完全设置。 spring security的登录页面也映射到/ login和附加的

localhost/login?error
当登录过程出错时,弹出安全性附加到url字符串的

。我还没有设置Spring安全认证,因此它认为存在错误。我将继续设置spring安全性,但这是我的POST请求未映射到doLogin方法的原因。