2012-06-19 49 views
5

he escrito el siguiente código:borrar una cookie usando 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(); 
} 

el problema es el siguiente: cuando se borra la cookie de la cookielist, cómo puedo poner el cookielist actualizado (sin cookies suprimido) de nuevo a ¿el cliente? solicitud o respuesta no tienen ningún método *.setCookies();. o las cookies se actualizarán automáticamente? mis mejores deseos.

+0

¿Has intentado ponerlo en tus HEADERS HTTP? – jocelyn

+0

@jocelyn no, yo no. –

Respuesta

14

Es necesario configurar la misma galleta con un valor null y una edad máxima de 0 (y el mismo camino, si ha configurado una personalizada) de nuevo en la respuesta de HttpServletResponse#addCookie().

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

Sin relación al problema concreto, que no es necesario masajear la matriz a una lista y volver a todos. El bucle for mejorado funciona en matrices como bueno. Además, usar == para comparar Long valores solo funcionaría para valores entre -128 y 127. En su lugar, necesita equals(). Así que en general, el método podría tener este aspecto:

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

Por cierto, da miedo ver request y response siendo las variables de instancia de alguna clase. ¿Estás seguro de que la clase en particular es enhebrable? Para comprender los servlets y la seguridad de hilos, puede encontrar útil esta respuesta: How do servlets work? Instantiation, sessions, shared variables and multithreading.

+1

@ BalusC así que no necesito llamar al método request.getCookies() y hacerlo a través del método WebUtils.getCookie? –

+0

No tengo idea de qué es el método 'WebUtils.getCookie'. Tal vez sea de un marco de terceros con el que no estoy familiarizado, pero del que no contó nada en su pregunta. Acabo de asumir la pila Java EE estándar ya que su pregunta no dio ninguna indicación de un marco de terceros. – BalusC

+1

@ BalusC, no conocía esa característica sobre los valores Long. lo arreglaré. thnx. –

Cuestiones relacionadas