我的网络应用程序有多种形式,其中最简单的就是登录表单(我使用的是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";
}
我的问题是,因为我正在对/account/login
进行POST,这就是浏览器地址栏中显示的内容。我真的希望它显示/account/profile
。我是否应该对/account/profile
进行POST,即使从概念上讲它是不正确的。
另一种解决方案是在/account/login
上进行POST,并在成功后重定向并在/account/profile
上进行GET。
假设我也有这样的处理程序方法:
@RequestMapping(value = "/account/login", method = RequestMethod.GET)
public String loginPage() {
return "/account/login";
}
哪些其他解决方案可能符合类似REST的URL映射的概念?
答案 0 :(得分:2)
我认为POST后的重定向最符合您的需求:
@RequestMapping(value = "/account/login", method = RequestMethod.GET)
public String loginPage() {
return "redirect:/account/profile";
}
该方法的优点(与当前方式相比 - 在操作中返回视图)是,如果用户按“F5”,表单将不会重新发布。这已成为一种模式:redirect after post。
如果您想知道重定向后如何显示错误Spring 3.1 support it。
P / s:实际上,进程链接与用户浏览器地址栏上显示的内容无关。如果您只关注URL,则可以使用“url-rewriting”库,例如Turkey URLRewriter