当前位置: 首页 > 知识库问答 >
问题:

Spring MVC 混淆了具有相同请求映射的获取和发布方法

禹正阳
2023-03-14

我有一个登录控制器,我将“/login”路径映射到两个不同的方法。一个用于get,另一个用于post。

@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 映射更改为“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,以便根据请求方法执行不同的事情。

此外,当我一开始创建表单时,我忘记指定一个方法="post",并且在测试它时提交了从该表单获取对“/登录”的请求。也许这连接了一些需要解开的东西。

这是一个错误吗?我可以将具有不同请求方法的相同url映射到其他控制器方法,但这个方法似乎不起作用。有什么想法吗?

共有1个答案

经炜
2023-03-14

我想通了。映射到POST请求的方法是因为我使用的是spring security,它还没有完全设置好。spring security的登录页面也被映射到/login,附加了

localhost/login?error

当登录过程出现错误时,spring security会在url字符串中添加一些内容。我还没有用spring security设置身份验证,所以它认为有一个错误。我将继续设置Spring Security性,但这是我的POST请求没有映射到doLogin方法的原因。

 类似资料:
  • 我读过一个映射是“关系在Java中是指源对象有一个引用另一个目标对象的属性,并且(如果)目标对象与源对象有反向关系,它也将是一个一个关系。”来源:http://en.wikibooks.org/wiki/java_persistence/OneToOne 基于以上,我假设一个表可以引用基数为(零)1的另一个表,而这个表可以反向引用基数为(零)1的第一个表。 所以,我创建了这个简单的实体(Cust可

  • 假设我们有一个使用Spring MVC和Spring Security配置的APIendpoint。我们希望能够处理@RequestMapping和@Secured注释对,其中仅有的@Secured注释值因对而异。这样,我们就可以根据相同请求的安全规则返回不同的响应主体。 这可以避免在方法体中直接检查安全规则,从而使代码更易于维护。 有一个不起作用的例子,下面是我们想要做的: 我们如何才能做到这一

  • 问题内容: 我有下表: 我想让Folder类具有父子关系。 问题答案: 我相信正确的映射将是: 该会的工作只有当每个家长有最多一个孩子,上面的代码适用于更一般的情况下,父母可以有许多儿童。另外,为简单起见,我省略了get / set方法。

  • 我会从我想达到的目标开始 意图 该软件在for循环中解析XML数据。处理数据的 for 循环将持续到 50(因为我得到了 50 个不同的结果)。我最初所做的是,-方法解析整个XML数据并将其保存到TextViews中并显示它。但现在我想添加一个启动画面,只要数据加载就会显示。 XML文件像任何其他普通XML文件一样构建,因此当我通过for循环时,键总是相同的,但值不同。 方法 我已经做的是创建一个

  • ObjectWithList、ListWrapper和ObjectWithWrapper类如下: MyCustomConverter类来包装/展开这些列表。 mapperConfiguration。xml配置文件 不幸的是,映射后,objectWithList的列表字段为null。我使用了调试器,在这种情况下,Dozer甚至没有输入MyCustomConverter。 令人惊讶的是,不同方向的映射

  • 当我测试一个控制器时,我发现下面的代码可以正常工作。但我不明白为什么模型在映射后返回后包含“PasspProperty”属性。PasspProperty类仅使用验证约束进行注释。在控制器中,它只在方法中使用@Valid annotation进行注释,如下面的代码所示。 我在控制器中有以下映射: 获取: 帖子: 我添加了以下测试和输出。如您所见,返回的ModelAndView包含未添加到@PostM