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

2022-09-04 20:46:38

我正在尝试在JSESSIONID cookie上设置httponly标志。但是,我正在使用Java EE 5,并且无法使用.首先,我尝试通过使用 从 servlet 内部创建我自己的 JSESSIONID cookie。setHttpOnly()doPost()response.setHeader()

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

然后,我了解到在响应对象到达过滤器之前,响应对象中有一些刷新/关闭操作,因此,如果我想操作数据,我需要扩展并将其传递给 。这已经完成了,但我仍然没有得到结果。显然我做错了什么,但我不知道是什么。HttpServletResponseWrapperfilterChain.doFilter()

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

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


答案 1

由于 Cookie 由 servletcontainer 管理,因此此设置是特定于 servletcontainer 的。目前还不清楚您正在使用哪一个,所以这里有一个Apache Tomcat 6.0目标答案,以便您知道您必须在哪个方向上寻找您的servlet容器:您需要将web应用程序元素的属性设置为。JSESSIONIDuseHttpOnly<Context>true

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

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


答案 2

您可以在 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");

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

我在过滤器中测试它


推荐