JSF 2.0: les cookies ne sont pas persisté immédiatement après l'appel AJAX, requête HTTP requis

StackOverflow https://stackoverflow.com/questions/4738652

Question

appel Ajax effectuée pour l'article remove dans le panier - méthode removeOrder() est appelée

UI appel removeOrder() (JSF et 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>

backend appel removeOrder() (gérée par le bean)

public void removeOrder(ActionEvent e) {
        String productName = (String) e.getComponent().getAttributes().get("remove");
        Product p = getProductByName(productName);
        inCart.remove(p);
        persistCookies();
        emptyCartNotifier();
        totalRendered();
    }

Ici les cookies est persisté, la production de cette méthode est prévu, un tableau Cookie contient les cookies avec des valeurs vides, c'est OK:

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);

}

problème ici a eu lieu, la méthode emptyCartNotifier () voir "précédent" non vides cookies array

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;
}

Après une requête HTTP effectuée, ce tableau Cookie est vraiment nettoyé.

Comme je vois, affrontement est:.
après appel AJAX cleans cookie qui contient HttpServletRequest cookies non vide jusqu'à ce qu'une nouvelle requête HTTP effectuée (utilisateur bouton soumettre ou passer le lien)

Y at-il une solution ou une bonne pratique pour la gestion des cookies immédiatement, quand app-web AJAX et moissonneuses-batteuses appels non-AJAX?

Merci.

Était-ce utile?

La solution

Attendez, quoi? En emptyCartNotifier, Vous appelez getCookies sur l'objet HttpRequest, qui est censé contenir les cookies été dans la requête HTTP qui a déclenché votre méthode, bien sûr, vous ne voyez pas les changements jusqu'à ce que la demande suivante .

Autres conseils

Votre problème de cookie est une chose, mais je pense qu'il est beaucoup plus facile de faire avancer les choses.

Dans votre page, il suffit de remplacer les pages que vous évoquez avec ceci:

<p:commandButton value="clean" action="#{showProducts.removeOrder(cart)}"
   process="@form" update="@form,:ccId:cCart:ccSizeId,:ccId:cCart:ccTotId" immediate="true" />

haricot de support (par exemple la session scope):

private double subtotal; // don't forget getter and setter

public void removeOrder(Product product) {
        inCart.remove(product);
        // calculate subtotal
}

Je suppose que vous montrer le sous-total et la liste peut-être tous les produits après avoir appelé removeOrder . Juste après avoir enlevé recalcul Sous-total du produit, et assurez-vous que le panier est rafraîchi ( mise à jour attribut).

Ce code est assez simple et facile à comprendre, et pourtant fait tout ce dont vous avez besoin. Pas besoin de "manuellement" gérer les cookies.

Vous pouvez essayer de régler votre setHttpOnly(true) les cookies, mais la question est pourquoi vous avez besoin « scope ajax- » cookie persistance du tout?

Pourquoi ne pas utiliser des variables locales dans votre vue / demande / séance scope haricots? Ils sont en fait conçus pour ce genre de tâches. Si vous voulez nouveau cookie persistance que vous faites dans setters ou des méthodes d'action correspondants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top