2010-06-07 29 views
11

Estoy intentando establecer el indicador httponly en la cookie JSESSIONID. Estoy trabajando en Java EE 5, sin embargo, y no puedo usar setHttpOnly(). Primero traté de crear mi propia cookie JSESSIONID desde el servlet doPost() usando response.setHeader().Configuración de httponly en la cookie JSESSIONID (Java EE 5)

Cuando eso no funcionó, probé response.addHeader(). Eso tampoco funcionó. Luego, descubrí que el servlet manejaba convertir la sesión en una cookie JSESSIONID e insertarla en el encabezado http, así que si quiero jugar con esa cookie, tendré que escribir un filtro. Escribí un filtro y jugué con setHeader()/addHeader() allí, de nuevo en vano.

Luego, me enteré de que hay algo de flush/close action en el objeto de respuesta antes de que llegue al filtro, así que si quiero manipular los datos, necesito extender HttpServletResponseWrapper y pasarlo a filterChain.doFilter(). Esto está hecho, pero todavía no estoy obteniendo resultados. Claramente estoy haciendo algo mal, pero no sé qué.

No estoy seguro de si esto es relevante para la pregunta en cuestión, pero el servlet no está devolviendo ningún documento html al navegador. Todo lo que realmente está sucediendo es que algunos objetos se están rellenando y devolviendo a un documento JSP. De alguna manera, he supuesto que el objeto Session se convierte en una cookie JSESSIONID y se envuelve, junto con los objetos agregados a la solicitud, en un encabezado http antes de enviarse al navegador.

Estaré encantado de publicar algún código, pero quiero descartar la posibilidad de que mis dificultades se deriven primero de un malentendido de la teoría.

+0

añadido algunas de formato de código porque othe En realidad, era un muro de texto inabordable. Todavía podría considerar publicar código de muestra de lo que ha intentado. –

Respuesta

10

Dado que la cookie JSESSIONID está gestionada por el servletcontainer, esta configuración es específica del servletcontainer. No está claro cuál está utilizando, así que aquí hay una respuesta específica Apache Tomcat 6.0 para que sepa en qué dirección deberá buscar su servletcontainer: debe establecer el atributo useHttpOnly del elemento <Context> de la aplicación web en true.

<Context useHttpOnly="true"> 
    ... 
</Context> 

también ver este Tomcat documentation sobre el elemento <Context>.

+0

Cuanto más exploro este tema, más me doy cuenta de cuán completamente ignorante soy acerca de casi todo. Estoy usando JBOSS 4.0 pero, por lo que he preparado, JBOSS es un contenedor EJB (?). No estoy seguro de qué servletcontainer estoy usando. Tendré que publicar nuevamente cuando descubra cuál es mi servletcontainer. – Mythandros

+0

JBoss es un servidor de aplicaciones. Utiliza Tomcat como contenedor de servlets y agrega algunos EJB y otras características de JavaEE sofisticadas además de eso. La historia de EJB es irrelevante aquí. Este es un problema HTTP/Servlet. Por cierto, no estoy seguro de si el antiguo JBoss 4.0 admite este atributo ... Al menos, las instrucciones son las mismas que para Tomcat. – BalusC

+0

Parece que ni siquiera JBoss 4.3 lo admite, necesitará 5.0: https: // problemas.jboss.org/browse/JBPAPP-3088 –

5

Puede usar esto con Java EE 5:

Para las versiones de Java Enterprise Edition antes de Java EE 6 una solución común es sobrescribir el encabezado de respuesta HTTP Set-Cookie con un valor de la cookie de sesión que añade explícitamente el HttpOnly bandera:

String sessionid = request.getSession().getId(); 
// be careful overwriting: JSESSIONID may have been set with other flags 
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); 

Fuente: https://www.owasp.org/index.php/HttpOnly

lo prueba en un filtro

Cuestiones relacionadas