2009-11-11 18 views
7

Todo,Configuración cookie persistente desde Java no funciona en IE

Aunque veo temas relacionados en el foro, pero no veo una solución clara a este respecto. Estoy tratando de establecer un javax.servlet.http.Cookie con un tiempo de caducidad (para que persista en todas las sesiones del navegador). Código:

public void respond(HttpServletRequest req, HttpServletResponse resp) { 
    int expiration = 3600; 
    Cookie cookie = new Cookie("TestCookie", "xyz"); 
    cookie.setDomain(""); 
    cookie.setVersion(0); 
    cookie.setPath("/"); 
    cookie.setMaxAge(expiration); 
    cookie.setSecure(false); 
    resp.addCookie(cookie); 
} 

No veo que se establezca esta cookie cuando reviso las herramientas de desarrollo de IE. La búsqueda en Internet me dio pistas de que IE no considera Max-Age, pero solo funciona con Expires. Si esto no funciona para IE, ¿existe una manera comprobada de configurar los encabezados de respuesta HTTP para una cookie persistente para que funcione para IE?

PD: Esto funciona bien en todos los demás navegadores.

He intentado crear una cadena para la cookie que tiene el atributo expira. IE logró crearlo, pero perdió el dominio (predeterminado - "") y mostró ".com" y lo convirtió en una cookie de sesión en lugar de una cookie persistente. Esto funciona bien en todos los demás navegadores.

Por favor ayuda. Gracias.

+0

¿Qué versión de IE? –

+1

Cualquier versión de IE, específicamente IE8 – thebigg

Respuesta

1

La respuesta está en Persistent cookies from a servlet in IE.

Su caso puede tener un sabor diferente del mismo problema: es decir, al anteponer el dominio con un "." (que estoy bastante seguro es una característica de cookie de la versión 1), algo en la pila de Java decide que es una cookie de versión 1 (no reconocida y no persistente por IE, incluso IE8) y envía ese formato de cookie.

O, como esa respuesta sugiere, ¿hay algo en su valor de cookie que contenga un carácter no reconocido?

1

Como javax.servlet.http.Cookie no le permite establecer el atributo Expires en la cookie, debe configurarlo manualmente.

También tienen que saber que Expires se debe especificar en forma de Wdy, DD Mon YYYY HH:MM:SS GMT siguiente RFC-2616 Fecha sección completa (more info).

En Java puede hacerlo de esta manera:

public void respond(HttpServletRequest req, HttpServletResponse resp) { 
    int expiration = 3600; 
    StringBuilder cookie = new StringBuilder("TestCookie=xyz; "); 

    DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss 'GMT'", Locale.US); 
    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.SECOND, 3600); 
    cookie.append("Expires=" + df.format(cal.getTime()) + "; "); 

    cookie.append("Domain=; "); 
    cookie.append("Version=0; "); 
    cookie.append("Path=/; "); 
    cookie.append("Max-Age=" + expiration + "; "); 
    cookie.append("Secure; "); 
    resp.setHeader("Set-Cookie", cookie.toString()); 
} 
+0

Solo mencionar que "GMT" en el formato de fecha anterior se puede establecer con 'z', sin las comillas simples. (Esto luego leería la zona horaria de la configuración regional pasada). – anotherdave

4

Trabajar con IE9, encontré que era el atributo HttpOnly que se requiere con el fin de conseguir que se hacen eco el valor de cookie en mensajes posteriores, por ejemplo, :

Set-Cookie: autologCk1=ABCD; Path=/autolog/; HttpOnly