java - Cookies persistentes de un servlet en IE
internet-explorer servlets (6)
Tengo una cookie que se genera a partir de un servlet y me gustaría ser persistente, es decir, establecer la cookie, cerrar IE, iniciar una copia de seguridad y aún así poder leer la cookie. El código que estoy usando es el siguiente:
HttpServletResponse response =
(HttpServletResponse) FacesContext.getCurrentInstance()
.getExternalContext().getResponse();
Cookie cookie = new Cookie("someKey", "someValue");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);
Esto funciona muy bien en Firefox, pero en IE 6/7, la cookie no se guarda entre los reinicios del navegador. Revisé todo lo que podía pensar en mi configuración, pero no puedo entender qué haría que se elimine la cookie. Por lo que sé, llamar a setMaxAge con un número positivo hace que la cookie sea persistente. ¿Alguna idea de por qué esto estaría yendo mal?
Editar
He verificado, utilizando el truco de información sugerido por Olaf, que la cookie intenta ser configurada como una cookie de sesión, no como una cookie persistente; la edad máxima se establece en "fin de la sesión". Por lo tanto, no parece que la edad máxima se establezca para IE: he verificado que en Firefox, la edad máxima está configurada correctamente. Todavía no tengo idea de lo que está pasando.
Como no uso Windows esto es un poco de memoria desfallecida: si configura las cookies de IE para "pedir permiso" cada vez que se establece una cookie, ¿no muestra cuánto tiempo se supone que la cookie es válida? Además, es posible que desee agregar el sitio a otra zona de seguridad (local o como se llame) para obtener una configuración completamente diferente e intente nuevamente.
Espero que esto ayude...
Pocas sugerencias
- ¿Estás usando fqdn para acceder al sitio?
- utiliza el violín para comprobar cómo se ve la cookie en la respuesta http.
- Compruebe si otros sitios en Internet están almacenando cookies con éxito.
No sé nada de Java o servlets, pero IE solo conservará una cookie si tiene una fecha de vencimiento, la configuración de max-age no es suficiente, IE continuará tratándola como una cookie de sesión.
Este http://www.mail-archive.com/[email protected]/msg52249.html tiene la respuesta, pero realmente no explica por qué.
Es decir, al codificar @ (que es un carácter inaceptable en las cookies de la versión 0), la cookie enviada en la respuesta tiene su versión configurada en 0 (aceptable para IE) en lugar de 1 (un formato diferente y, por lo tanto, IE inaceptable).
Mi problema era del tipo de lo mismo. Estábamos Base64 codificando nuestro valor de cookie y enviándolo hacia abajo. Sin embargo, Base64 incluye caracteres como ''='' ... que nuevamente es ilegal en la versión 0 y, por lo tanto, inaceptable para IE.
El misterio que me queda es: una parte de la pila es lo suficientemente "inteligente" como para reconocer que el valor de la cookie no es válido como una cookie de versión 0 y decide enviar la respuesta como una cookie de versión 1 (que incluye un número de versión explícito, caracteres "inaceptables", campo de edad máxima en lugar de vencimiento, etc.) No sé si es Tomcat, Faces, Spring o javax.servlet el que toma la decisión de voltear la versión.
En pocas palabras: la codificación de URI en el valor de la cookie asegurará que la cookie configurada en el navegador sea la versión 0 y, por lo tanto, persistida por IE.
También tuve un problema similar con IE8, excepto que la cookie persistía cuando se usaba http, pero no cuando se usaba https. La solución de Intelectual Tortoise funcionó para mí, ya que tenía ''='' y otros caracteres que estaban arruinándolo. Antes de codificar la cookie https, se mostraba como que expiraba en "Fin de la sesión". Después de codificar el valor, expiró con el maxAge que pasé. Estos son los métodos que utilicé para codificar / decodificar el valor de la cookie antes de configurarla y después de recuperarla:
public static String encodeString(String s) {
String encodedString = s;
try{
encodedString = URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {}
return encodedString;
}
public static String decodeString(String s) {
String decodedString = s;
try{
decodedString = URLDecoder.decode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {}
return decodedString;
}
try{
encodedString = URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {}
return encodedString;`a`
}
public static String decodeString(String s) {
String decodedString = s;
try{
decodedString = URLDecoder.decode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {}
return decodedString;
}