0

次の問題があります。

セキュリティ上の理由から、POST を使用してモジュール (異なるコントローラー) 間で情報を送信したいと考えています。私の論理は次のようなものです:

ユーザーの検索 > 特定のアイテムのクリック > ポスト リクエストを含むフォームをコントローラーに送信 > コントローラーが特定のアイテムのビューを表示 > ユーザーがサブアイテム ページをクリック > サブアイテムのコントローラーにポスト リクエストを含むフォームを送信

ただし、POST の仕組みが原因で、サブアイテム ページからアイテム ページに戻ると、「Web ページの有効期限が切れました」というメッセージが表示されます。

この問題に対する私の解決策は、この投稿HttpSessionのおかげで、これらのパラメーターを Java の に保存することです。しかし、私はそれをどのように進めるかについて特に確信が持てません。

たとえば、ここに私のコードのいくつかのスニペットがあります(記録のために、ビューリゾルバーとして thymeleaf を使用しています):

Search.html スニペット

<tr th:each="customer:${results.pageList}">
   <td>
       <form method="POST" id="goToUser" name="goToUser" action="/customer/">
           <input type="hidden" name="acctCustNbr" th:value="${customer.acctCustNbr}"/>
            <a href="javascript:;" onclick="javascript:document.getElementById('goToUser').submit();"
                th:text="${customer.acctCustNbr}">000010</a>
       </form>
   </td>
 <!-And so on-->

このリクエストを受け取る顧客 (または例ではアイテム) コントローラー:

@RequestMapping(value = "/customer/", method = RequestMethod.POST)
public String getCustomer(@RequestParam(value = "acctCustNbr", required = false) String acctCustNbr,
                          Model model,
                          HttpSession session) {
    boolean error = false;
    String errorMsg;
    logger.info("acctCustNbr obtained is >" + acctCustNbr + "<");
    if(acctCustNbr==null){
        acctCustNbr = (String) session.getAttribute("acctCustNbr");
    }
    else
        session.setAttribute("acctCustNbr", acctCustNbr);

    /*Service methods and model additions*/

では、この初期段階をどのように乗り越えればよいでしょうか。私のサブアイテムのコントローラーはセッション属性を正常に取得できるようですが、ブラウザーに再度アクセスすると、恐ろしい有効期限切れの警告が表示されます。

/customer/私の論理は、ユーザーが送信するこのページに戻るボタンを押している場合ですacctCustNbr==null。これはうまくいかないので、明らかに私は間違っています。

だから私の質問は、ここで何が間違っているのですか?



@skirschのおかげで解決

コントローラーメソッドの名前を次のように変更しました。

@RequestMapping(value = "/customer/", method = RequestMethod.GET)
public String getCustomer(Model model, HttpSession session) {
    boolean error = false;
    String errorMsg;
    /** service invocations and stuff**/

そしてこれを追加しました:

@RequestMapping(value = "/customer1/", method = RequestMethod.POST)
public String storeAcctCustNbrInSession(@RequestParam(value = "acctCustNbr", required = false) String acctCustNbr,
                                        Model model, HttpSession session) {
    session.setAttribute("acctCustNbr", acctCustNbr);
    return "redirect:/customer/";
}
4

1 に答える 1

1

セッションにデータを保存した後、ブラウザーを別の場所にリダイレクトする必要があります。この他の場所は

@RequestMapping(value = "/customer/", method = RequestMethod.GET)
public String getCustomerFromSessionValue(Model model, HttpSession session) { ... }

GET メソッドを使用してリダイレクトすると、「恐ろしい期限切れアラート」は発生しません。投稿後のリダイレクト
を参照してください

于 2013-04-08T21:17:05.803 に答える