2010-08-12 17 views
6

que se trata de eliminar una cookie en un servlet con este códigoeliminación de cookies en servlet

Cookie minIdCookie = null; 

for (Cookie c : req.getCookies()) { 
    if (c.getName().equals("iPlanetDirectoryPro")) { 
     minIdCookie = c; 
     break; 
    } 
} 

if (minIdCookie != null) { 
    minIdCookie.setMaxAge(0); 
    minIdCookie.setValue(""); 
    minIdCookie.setPath("/"); 
    res.addCookie(minIdCookie); 
} 

res.flushBuffer(); 

Pero esto no da efecto y ningún cambio en las propiedades de la galleta.

También intenté agregar una cookie en este servlet y esto funciona bien.

¿Por qué no puedo cambiar las propiedades de una cookie existente?

Respuesta

0

El problema era que la cookie que quería eliminar tenía una ruta que era "/ admin" y mi servlet de cierre de sesión tenía la ruta "/ admin/logoutServlet". Cuando obtengo la cookie de la solicitud, la ruta se establece en nulo. Entonces, cuando agrego la cookie, la ruta se establece en "/ admin /" como mi servlet. Si creé una cookie con la ruta "/ admin /", el servlet pudo eliminarla.

Resolví el problema al establecer explícitamente la ruta de la cookie antes de agregarla a la respuesta.

minIdCookie.setMaxAge(0); 
minIdCookie.setPath("/"); 
res.addCookie(minIdCookie); 

Pero no entiendo por qué el camino es nulo.

+0

La ruta siempre es nula porque solo se necesita en la respuesta. Cuando entra una solicitud, no es necesaria (o eso dicen) y, por lo tanto, no se establece. – OnResolve

6

No debe cambiar la ruta. Esto cambiaría la identidad de la cookie. Si la cookie se estableció para una ruta como /foo y la cambia a /, el cliente ya no asociará la cookie modificada con la cookie original. Una cookie se identifica por el nombre y la ruta.

El solo ajuste de maxage a 0 debería ser suficiente.

Cookie[] cookies = request.getCookies(); 
if (cookies != null) { // Yes, this can return null! The for loop would otherwise throw NPE. 
    for (Cookie cookie : cookies) { 
     if (cookie.getName().equals("iPlanetDirectoryPro")) { 
      cookie.setMaxAge(0); 
      response.addCookie(cookie); 
      break; 
     } 
    } 
} 

También es necesario asegurarse de que usted está leyendo/probar la galleta en la posterior solicitud nueva, no en la solicitud actual.

+0

El problema fue que traté de cambiar una cookie con la ruta "/ admin" y mi ruta de servlets es "/ admin /". ¿no es posible eliminar una cookie en otra ruta u otro dominio? –

+0

Puede eliminar una cookie en otra ruta del mismo dominio. Solo tiene que establecer su maxage en 0. No debe cambiar la ruta. Solo crearía una nueva cookie (que a su vez desaparecería inmediatamente porque maxage es 0). No puede acceder a las cookies en otro dominio. Esta es una restricción de seguridad. Puede acceder a las cookies de más alto nivel de otro subdominio. Solo necesita establecer el dominio como '.example.com' en lugar de' example.com'. – BalusC

4

Entiendo que esto es hace algunos años, pero la respuesta que BalusC dio arriba no es del todo correcta, y la respuesta aceptada de Stefan realmente no da todos los detalles.

La ruta y el dominio siempre serán nulos cuando recupere las cookies en Java porque solo son necesarias en la respuesta para el navegador del cliente. Sin embargo, si se encuentra en el mismo dominio de seguridad (independientemente de la ruta), usted todavía tiene los derechos para eliminarlos. Lamentablemente, como la ruta no está incluida, no puede eliminar la cookie ahora sin conocerla explícitamente. Simplemente usando el mismo nombre de cookie, pero una ruta diferente no funcionará. Esos son considerados dos cookies diferentes, y usted encontrará que en lugar de eliminar la cookie, acaba de crear otra en una ruta diferente.

El otro problema que tienen la mayoría de los desarrolladores es que intentan comprobar la ausencia de cookies antes de que se haya confirmado la respuesta. Una cookie no se elimina hasta que el navegador del cliente pueda leer la respuesta y eliminarla del sistema de archivos. Si reenvía a otro servlet con la esperanza de que haya eliminado una cookie, encontrará que todavía existe (ya que la solicitud inicial es la misma). En este sentido, los atributos de solicitud son una opción mucho mejor.

3

La mayoría de las veces el problema es con la ruta de la cookie. Así que tenga cuidado de especificar la ruta al crear una cookie. Y luego use la misma ruta mientras descarta una cookie. El concepto de trayectoria es

public String getPath() public void setPath (String path) Estos métodos obtener o establecer la ruta de acceso al que se aplica la cookie. Si no especifica una ruta, el navegador devuelve la cookie solo a las URL en o debajo del directorio que contiene la página que envió la cookie. Por ejemplo, si el servidor envió la cookie desde //ecommerce.site.com/toys/specials.html, el navegador enviará la cookie al conectarse al //ecommerce.site.com/toys/bikes/ beginners.html, pero no a //ecommerce.site.com/cds/classical.html. El método setPath puede usarse para especificar algo más general. Por ejemplo, someCookie.setPath ("/") especifica que todas las páginas del servidor deben recibir la cookie. La ruta especificada debe incluir la página actual; es decir, puede especificar una ruta más general que la predeterminada, pero no , una más específica. Entonces, por ejemplo, un servlet en // host/store/cust-service/request podría especificar una ruta de/store/ (desde/store/includes/store/cust-service /) pero no una ruta de /store/cust-service/returns/(dado que este directorio no incluye /store/cust-service /).

para obtener más información de propiedades relacionadas con la ruta y la cookie, puede visitar here.

0

Creo que es mejor usar null en lugar de cadena vacía. es decir. cambie minIdCookie.setValue(""); a minIdCookie.setValue(null);