JSF 2.0:ajax呼び出しの直後にCookieが持続しません、HTTPリクエストが必要です
-
12-10-2019 - |
質問
ショッピングカートからアイテムを削除するために実行されたAjaxコール - removeOrder()
メソッドが呼び出されます
ui removeOrder()
電話(JSF&PrimeFaces):
<p:commandButton value="clean" actionListener="#{showProducts.removeOrder}"
process="@form" update="@form,:ccId:cCart:ccSizeId,:ccId:cCart:ccTotId" immediate="true">
<f:attribute name="remove" value="#{cart.name}"/>
</p:commandButton>
バックエンド removeOrder()
コール(マネージドビーン)
public void removeOrder(ActionEvent e) {
String productName = (String) e.getComponent().getAttributes().get("remove");
Product p = getProductByName(productName);
inCart.remove(p);
persistCookies();
emptyCartNotifier();
totalRendered();
}
ここでは、Cookieが持続し、この方法の出力が予想されるように、Cookieアレイには空の値のCookieが含まれています。
private void persistCookies() {
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
String ids = "";
for (Product prod : inCart) {
// TODO change logic to support real count,for now 1 is available only
ids += prod.getId() + ";" + prod.getCount() + "_";
}
Cookie cookie = new Cookie(SC_COOKIE, ids);
Cookie cookie2 = new Cookie(SC_SIZE, String.valueOf(inCart.size()));
Cookie cookie3 = new Cookie(SC_TOTAL_PRICE, String.valueOf(subTotal));
cookie3.setPath("/");
cookie3.setMaxAge(TWO_WEEKS);
httpServletResponse.addCookie(cookie3);
cookie.setPath("/");
cookie.setMaxAge(TWO_WEEKS);
cookie2.setPath("/");
cookie2.setMaxAge(TWO_WEEKS);
httpServletResponse.addCookie(cookie);
httpServletResponse.addCookie(cookie2);
}
ここで問題が発生した、メソッドemhtycartnotifier()を参照 空ではない「以前の」クッキー 配列
private String emptyCartNotifier() {
HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
Cookie[] cookies = httpServletRequest.getCookies();
boolean isCookiePresent = false;
if (cookies != null) {
for (Cookie c : cookies) {
if (SC_COOKIE.equals(c.getName()) && (!c.getValue().isEmpty())) {
isCookiePresent = true;
}
}
}
if (inCart.isEmpty() && (!isCookiePresent)) {
emptyCartNotifier = "you cart is empty";
isFormRendered = false;
} else {
emptyCartNotifier = "";
isFormRendered = true;
}
return emptyCartNotifier;
}
HTTPリクエストが実行された後、そのクッキーアレイは本当にクリーンアップされます。
私が見るように、衝突は次のとおりです。
Ajax CallがCookieを掃除した後、それはそれです HttpServletRequest
新しいHTTPリクエストが実行されるまで、空でないCookieが含まれます(ユーザーの送信ボタンまたはリンクごとに移動します)。
Web-AppがAJAXと非Ajaxの呼び出しを組み合わせた場合、即時のCookie管理のための解決策や良い練習はありますか?
ありがとうございました。
解決
待って、何?の emptyCartNotifier
, 、あなたは呼んでいます getCookies
に HttpRequest
オブジェクト。 HTTPリクエストにありました それはあなたの方法を引き起こしたので、もちろん次の要求まで変更は見られません。
他のヒント
あなたのクッキーの問題は一つのことですが、私は物事を成し遂げるためのはるかに簡単な方法があると思います。
あなたのページで、あなたがこれに言及したページを置き換えるだけです:
<p:commandButton value="clean" action="#{showProducts.removeOrder(cart)}"
process="@form" update="@form,:ccId:cCart:ccSizeId,:ccId:cCart:ccTotId" immediate="true" />
バッキングビーン(例:セッションスコープ):
private double subtotal; // don't forget getter and setter
public void removeOrder(Product product) {
inCart.remove(product);
// calculate subtotal
}
私はあなたが小計を示し、おそらく電話した後にすべての製品を一覧表示すると思います Orderをremody. 。製品を削除した後、小計を再計算し、ショッピングカートがリフレッシュされていることを確認してください。アップデート 属性)。
このコードは十分にシンプルで理解しやすいですが、必要なことはすべて行います。クッキーを「手動で」管理する必要はありません。
クッキーを設定してみてください setHttpOnly(true)
, 、しかし、問題は、なぜ「Ajaxスコープ」クッキーの永続性が必要なのでしょうか?
あなたのビュー/リクエスト/セッションスコープされた豆でローカル変数を使用してみませんか?それらは実際にそのようなタスクのために設計されています。追加のCookieの永続性が必要な場合は、対応するセッターまたはアクションメソッドでそれを行います。