次の問題があります。
セキュリティ上の理由から、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/";
}