JSF 2.0: I cookie non sono persisteva subito dopo AJAX chiamata, HTTP richiesta richiesto
-
12-10-2019 - |
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.
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.