JSF 2.0: файлы cookie не сохраняются сразу после вызова AJAX, требуется запрос HTTP
-
12-10-2019 - |
Вопрос
Ajax Call выполняется, чтобы удалить товар из корзины покупок - 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);
}
Здесь возникла проблема, метод EmptyCartNotifier () см. непустые «предыдущие» куки множество
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 -запроса этот массив cookie действительно очищается.
Насколько я вижу, столкновение:
После того, как Ajax Call очищает cookie, это HttpServletRequest
Содержит непустые cookie до тех пор, пока не выполнит новый HTTP-запрос (кнопка пользователя или перейти по ссылке).
Существует ли решение или хорошая практика для немедленного управления файлами cookie, когда Web-App сочетает в себе вызовы AJAX и Non-AJAX?
Спасибо.
Решение
Чего ждать? В emptyCartNotifier
, Ты звонишь getCookies
на HttpRequest
объект, который должен содержать куки, которые были в HTTP -запросе Это вызвало ваш метод, поэтому, конечно, вы не видите изменения до следующего запроса.
Другие советы
Ваша проблема с печеньем - это одно, но я думаю, что есть гораздо более простой способ сделать что -то.
На вашей странице просто замените страницы, которые вы упомянули на это:
<p:commandButton value="clean" action="#{showProducts.removeOrder(cart)}"
process="@form" update="@form,:ccId:cCart:ccSizeId,:ccId:cCart:ccTotId" immediate="true" />
Поддержка фасоли (например, сеанс Session Scoped):
private double subtotal; // don't forget getter and setter
public void removeOrder(Product product) {
inCart.remove(product);
// calculate subtotal
}
Я думаю, вы показываете подтолс и, возможно, перечислите все продукты после вызова удалить заказ. Анкет Просто пересчитайте подтолс после удаления продукта и убедитесь, что корзина обновляется (корзина обновляется (Обновить атрибут).
Этот код достаточно простой и прост для понимания, и все же делает все необходимое. Не нужно «вручную» управлять куки.
Вы можете попробовать установить файлы cookie setHttpOnly(true)
, но вопрос в том, зачем вам вообще нужна упорство в печенье "Ajax-Coped вообще?
Почему бы не использовать локальные переменные в вашем просмотре/запросе/сеансе, а также с сеансами? Они на самом деле предназначены для таких задач. Если вы хотите дополнительную настойчивость cookie, вы делаете это в соответствующих сеттерах или методах действия.