java cookies cookie-httponly servlet-2.5

Configurando una cookie httponly con javax.servlet 2.5



cookies cookie-httponly (8)

Aquí hay una función que establece una cookie:

public void addCookie(String cookieName, String cookieValue, Integer maxAge, HttpServletResponse response) { Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setPath("/mycampaigns"); cookie.setSecure(isSecureCookie); cookie.setMaxAge(maxAge); response.addCookie(cookie); }

Creo en el servlet 3.0, hay una manera de hacerlo directamente. Desafortunadamente, mi organización usa 2.5 y la ACTUALIZACIÓN en este momento NO ES UNA OPCIÓN.

¿Hay alguna forma de utilizar la respuesta para configurar la cookie? Aquí hay un ejemplo que encontré en línea

response.setHeader("SET-COOKIE", "[SOME STUFF]" +"; HttpOnly")

Si esta es la única forma de hacer lo que quiero, ¿con qué reemplazaría "[ALGUNAS COSAS]" con el fin de no perder ninguno de los datos que mi función almacena actualmente en la cookie?


Este código funciona sin utilizar response.setHeader() :

public void addCookie(String cookieName, String cookieValue, Integer maxAge, HttpServletResponse response) { Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setPath("; HttpOnly;"); cookie.setSecure(isSecureCookie); cookie.setMaxAge(maxAge); response.addCookie(cookie); }


Para Servlet API 2.5, puedes usar

response.addHeader("Set-Cookie","name=value; HttpOnly");

Tenga cuidado con el uso de response.setHeader () porque elimina todas las demás cookies, por ejemplo, la cookie JSESSIONID.


Para las versiones de Java Enterprise Edition anteriores a JEE 6, digamos Servlet 2.5, puede encontrar una solución here desde OWASP. A continuación se muestra un ejemplo:

/** * Issue a cookie to the browser * * @param response * @param cookieName * @param cookieValue * @param cookiePath * @param maxAgeInSeconds */ public static void issueCookieHttpOnly(HttpServletResponse response, String cookieName, String cookieValue, String cookiePath, long maxAgeInSeconds) { Date expireDate= new Date(); expireDate.setTime (expireDate.getTime() + (1000 * maxAgeInSeconds)); // The following pattern does not work for IE. // DateFormat df = new SimpleDateFormat("dd MMM yyyy kk:mm:ss z"); // This pattern works for Firefox, Chrome, Safari and Opera, as well as IE. DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy kk:mm:ss z"); df.setTimeZone(TimeZone.getTimeZone("GMT")); String cookieExpire = df.format(expireDate); StringBuilder sb = new StringBuilder(cookieName); sb.append("="); sb.append(cookieValue); sb.append(";expires="); sb.append(cookieExpire); sb.append(";path="); sb.append(cookiePath); sb.append(";HttpOnly"); response.setHeader("SET-COOKIE", sb.toString()); }


Si no quieres hardcode HttpOnly; o no te gusta agregar encabezado, usa apache shiro como este:

void addCookie(javax.servlet.http.Cookie httpCookie, HttpServletRequest request, HttpServletResponse response) { org.apache.shiro.web.servlet.Cookie cookie = new org.apache.shiro.web.servlet.SimpleCookie(httpCookie.getName()); cookie.setValue(httpCookie.getValue()); cookie.setPath(httpCookie.getPath()); // set other stuff from the original httpCookie cookie.setHttpOnly(true); cookie.saveTo(request, response); }


Si no quieres usar:

response.addHeader("Set-Cookie","name=value; HttpOnly");

entonces puedes usar el siguiente código en el servlet 2.5 . Funcionará perfecto en chrome , firefox e IE11 .

Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setPath(";Path=/;HttpOnly;"); cookie.setSecure(isSecureCookie); cookie.setMaxAge(maxAge); response.addCookie(cookie);

Nota : Como sabe, no tenemos el método setHttpOnly() en la versión de servlet 2.5 , por lo que en lugar de esto puede usar:

setPath(";Path=/;HttpOnly;");

creará una cookie con la ruta " / " y creará la cookie como HttpOnly


Spring hace esto utilizando la reflexión sin romper en los contenedores servlet 2.5.

Method setHttpOnlyMethod = ReflectionUtils.findMethod(Cookie.class, "setHttpOnly", boolean.class); if (setHttpOnlyMethod != null) { ReflectionUtils.invokeMethod(setHttpOnlyMethod, cookie, Boolean.TRUE); }

Sin embargo, el método setHttpOnly solo está disponible en Servlet 3.0 solo en adelante.


Tienes razón, la configuración manual del encabezado es la forma correcta de lograr tu objetivo.

También puede usar javax.ws.rs.core.NewCookie o cualquier otra clase con un método toString útil para imprimir una cookie en un encabezado para hacer las cosas más simples.

public static String getHttpOnlyCookieHeader(Cookie cookie) { NewCookie newCookie = new NewCookie(cookie.getName(), cookie.getValue(), cookie.getPath(), cookie.getDomain(), cookie.getVersion(), cookie.getComment(), cookie.getMaxAge(), cookie.getSecure()); return newCookie + "; HttpOnly"; }

Y el uso:

response.setHeader("SET-COOKIE", getHttpOnlyCookieHeader(myOriginalCookie));


Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setPath("/"); cookie.setMaxAge(-1); response.addCookie(cookie);

En realidad, en mi caso, este código no funciona exactamente.
Los valores de ruta no son "/"

Pero agregue esta cookie.setComment("; HttpOnly;"); ¡funciona bien!