0

我的 Web 应用程序有许多表单,其中最简单的是登录表单(我使用的是 thymeleaf):

    <form method="post" action = "#" th:action = "@{/account/login}">
        Username: <input name="username" type="text" /> <br /> 
        Password: <input name="password" type="password" /> <br /> 
                  <input name="login" type="submit" value="Login" />
    </form>

我的控制器处理程序方法是:

@RequestMapping(value = "/account/login", method = RequestMethod.POST, params = "login")
public String login(@RequestParam("username") String username, 
        @RequestParam("password") String password,
        Model model) {

    // do some logging in           
    return "/account/profile";
}

我的问题是因为我正在做一个 POST /account/login,这就是浏览器地址栏中显示的内容。我真的很想展示它/account/profile/account/profile即使从概念上讲它不正确,我是否应该改为进行 POST 。

另一种解决方案是在 POST 上/account/login进行,成功后重定向并在/account/profile.

假设我也有这样的处理方法:

@RequestMapping(value = "/account/login", method = RequestMethod.GET)
public String loginPage() {
    return "/account/login";
}

还有哪些其他解决方案可能适合类似 REST 的 url 映射的概念?

4

1 回答 1

2

我认为 POST 之后的重定向最适合您的需求:

@RequestMapping(value = "/account/login", method = RequestMethod.GET)
public String loginPage() {
    return "redirect:/account/profile";
}

这种方法的优点(与当前的方法相比——在操作中返回视图)是,如果用户按下“F5”,表单将不会被重新发布。这已成为一种模式:在 post 之后重定向

如果您想知道重定向后如何显示错误,Spring 3.1 支持它

P/s:实际上,处理的链接与用户浏览器地址栏上显示的内容无关。如果你只关心 URL,你可以使用“url-rewriting”库,例如土耳其 URLRewriter

于 2013-01-15T04:42:13.983 回答