Domanda

Ajax chiamata eseguita al fine di Articolo Rimuovi dal carrello - metodo removeOrder() è chiamato

UI chiamata 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>

Backend chiamata removeOrder() (bean gestito)

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

Qui cookie viene mantenuto, l'uscita di questo metodo, come ci si aspetta, un array cookie contiene biscotti con valori vuoti, va bene così:

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

}

Si è verificato un problema Qui, il metodo emptyCartNotifier () vedi non vuoti cookie "precedenti" 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;
}

Dopo ogni richiesta HTTP effettuata, tale matrice Cookie è davvero ripulito.

Per come la vedo, è scontro:.
dopo AJAX pulisce chiamata biscotto, che contiene HttpServletRequest biscotto non vuoto fino a nuova richiesta HTTP effettuata (pulsante utente inviare o andare dal link)

C'è una soluzione o di buone pratiche per la gestione immediata dei cookie, quando combina web-app AJAX e non-AJAX chiamate?

Grazie.

È stato utile?

Soluzione

Aspetta, cosa? In emptyCartNotifier, si sta chiamando getCookies sull'oggetto HttpRequest, che dovrebbe contenere i cookie che sono stati nella richiesta HTTP che ha attivato il tuo metodo, così, naturalmente, non si vede cambiamenti fino alla successiva richiesta .

Altri suggerimenti

Il tuo problema cookie è una cosa, ma penso che ci sia un modo molto più semplice per fare le cose.

Nella pagina, basta sostituire le pagine, si fa riferimento a questo:

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

Backup di fagioli (ad esempio con scope di sessione):

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

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

Credo che si mostra il totale parziale e forse elencare tutti i prodotti dopo aver chiamato removeOrder . Basta subtotale ricalcolo dopo la rimozione del prodotto, e assicurarsi che il carrello della spesa viene aggiornato ( update di attributo).

Questo codice è abbastanza semplice e facile da capire, eppure fa tutto il necessario. Non c'è bisogno di "manualmente" gestire i cookie.

Si potrebbe provare impostare il cookie setHttpOnly(true), ma la domanda è: perché avresti bisogno "ajax-ambito" cookie persistenza a tutti?

Perché non usare le variabili locali nella vista / richiesta / sessione di fagioli ambito? Sono in realtà progettati per questo genere di attività. Se si desidera cookie di ulteriore persistenza lo si fa in setter o metodi di azione corrispondente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top