在JSESSIONID cookie中设置httponly(Java EE 5)

Myt*_*ros 13 java cookies servlets httponly jsessionid

我正在尝试在JSESSIONID cookie上设置httponly标志.我在Java EE 5中工作,但是无法使用setHttpOnly().首先,我尝试doPost()使用在servlet中创建自己的JSESSIONID cookie response.setHeader().

如果那不起作用,我试过了response.addHeader().那也行不通.然后,我了解到servlet处理将会话转换为JSESSIONID cookie并将其插入http头中,因此如果我想使用该cookie,我将不得不编写一个过滤器.我写了一个过滤器和setHeader()/ addHeader()在那里玩,再次无济于事.

然后,我了解到响应对象在进入过滤器之前会有一些刷新/关闭动作,所以如果我想操纵数据,我需要扩展HttpServletResponseWrapper并传递给它filterChain.doFilter().这已经完成,但我仍然没有得到结果.显然我做错了但我不知道是什么.

我不确定这与手头的问题是否完全相关,但servlet没有将任何html文档返回给浏览器.所有真正发生的事情是正在填充一些对象并将其返回到JSP文档.我有点假设Session对象被转换为JSESSIONID cookie,并在发送到浏览器之前将其与添加到请求中的对象一起包装在http标头中.

我很乐意发布一些代码,但我想排除我的困难源于对该理论的误解的可能性.

Bal*_*usC 11

由于JSESSIONIDcookie由servletcontainer管理,因此该设置是特定于servletcontainer的.目前还不清楚你正在使用哪一个,所以这里是一个Apache Tomcat 6.0目标答案,这样你就知道你需要在哪个方向寻找你的servletcontainer:你需要设置useHttpOnlywebapplication <Context>元素的属性true.

<Context useHttpOnly="true">
    ...
</Context>
Run Code Online (Sandbox Code Playgroud)

另请参阅有关该元素的Tomcat文档<Context>.


小智 5

您可以在Java EE 5中使用它:

对于Java EE 6之前的Java Enterprise Edition版本,常见的解决方法是使用显式附加HttpOnly标志的会话cookie值覆盖SET-COOKIE http响应头:

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

资料来源:https://www.owasp.org/index.php/HttpOnly

我把它测试成一个过滤器