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、成功した後、リダイレクトしてGETを実行すること/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" を押してもフォームが再投稿されないことです。これがパターンになりました: redirect after post

リダイレクト後にエラーを表示する方法について疑問がある場合は、Spring 3.1 でサポートされています。

P/s: 実際には、処理へのリンクは、ユーザーのブラウザのアドレス バーに表示されるものとは関係ありません。URL のみに関心がある場合は、Turkey URLRewriterなどの「url-rewriting」ライブラリを使用できます。

于 2013-01-15T04:42:13.983 に答える