2012-06-19 6 views
5

ho scritto il codice successivo:l'eliminazione di un cookie utilizzando Java

public void delete(MyType instance) { 
     List<MyType> myList = this.getAll(); 

     Cookie[] cookies = request.getCookies(); 
     List<Cookie> cookieList = new ArrayList<Cookie>(); 
     cookieList = Arrays.asList(cookies); 
     for(Cookie cookie:cookieList) { 
      if(Long.valueOf(cookie.getValue()) == instance.getId()) { 
       cookieList.remove(cookie); 
      } 
     } 
     myList.remove(instance); 
     cookies = (Cookie[]) cookieList.toArray(); 
} 

il problema è prossimo: quando elimino il cookie dal cookielist, come posso mettere la cookielist aggiornato (senza biscotto cancellato) di nuovo a il cliente? richiesta o risposta non hanno metodi *.setCookies();. o i cookie si aggiorneranno automaticamente? migliori saluti.

+0

Hai provato a inserirlo nelle intestazioni HTTP? – jocelyn

+0

@jocelyn no, non l'ho fatto. –

risposta

14

è necessario impostare lo stesso cookie con un valore null e un'età massima di 0 (e lo stesso percorso, se è stato impostato uno personalizzato) torna sulla risposta da HttpServletResponse#addCookie().

cookie.setValue(null); 
cookie.setMaxAge(0); 
cookie.setPath(theSamePathAsYouUsedBeforeIfAny); 
response.addCookie(cookie); 

Estranei al problema concreto, non è necessario massaggiare la matrice ad una lista e di nuovo a tutti. Il ciclo avanzato per funziona su array come buono. Inoltre, l'utilizzo di == per confrontare i valori Long funzionerebbe solo con valori compresi tra -128 e 127. È necessario invece equals(). Quindi, tutto sommato, il metodo potrebbe essere la seguente:

public void delete(MyType instance) { 
    Cookie[] cookies = request.getCookies(); 

    if (cookies != null) { 
     for (Cookie cookie : cookies) { 
      if (Long.valueOf(cookie.getValue()).equals(instance.getId())) { 
       cookie.setValue(null); 
       cookie.setMaxAge(0); 
       cookie.setPath(theSamePathAsYouUsedBeforeIfAny); 
       response.addCookie(cookie); 
      } 
     } 
    } 
} 

Tra l'altro, è spaventoso vedere request e response essendo le variabili di una classe di istanza. Sei sicuro che la particolare classe sia protetta da thread? Per comprendere servlet e threadsafety, è possibile trovare questa risposta utile: How do servlets work? Instantiation, sessions, shared variables and multithreading.

+1

@ BalusC quindi non ho bisogno di chiamare il metodo request.getCookies() e farlo tramite il metodo WebUtils.getCookie? –

+0

Non ho idea di quale sia il metodo 'WebUtils.getCookie'. Forse è da una struttura di terze parti con cui non ho familiarità ma di cui non hai detto nulla nella tua domanda. Ho appena assunto lo stack Java EE standard in quanto la tua domanda non ha dato alcuna indicazione di un framework di terze parti. – BalusC

+1

@ BalusC, non conoscevo questa caratteristica sui valori Long. Lo aggiusterò. thnx. –

Problemi correlati