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

Posted

技术标签:

【中文标题】在 JSESSIONID cookie 中设置 httponly (Java EE 5)【英文标题】:Setting httponly in JSESSIONID cookie (Java EE 5) 【发布时间】:2011-02-28 20:47:00 【问题描述】:

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

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

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

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

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

【问题讨论】:

添加了一些代码格式,否则它有点难以接近的文字墙。可能仍会考虑发布您尝试过的示例代码。 【参考方案1】:

由于JSESSIONID cookie 由 servletcontainer 管理,因此此设置是特定于 servletcontainer 的。目前还不清楚您使用的是哪一个,所以这里有一个Apache Tomcat 6.0 有针对性的答案,以便您知道您必须在哪个方向寻找您的 servletcontainer:您需要设置 web 应用程序的 <Context> 元素的 useHttpOnly 属性到true

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

另请参阅此Tomcat documentation 关于&lt;Context&gt; 元素。

【讨论】:

我对这个话题的探索越多,我就越意识到自己对几乎所有事情都一无所知。我正在使用 JBOSS 4.0,但是,根据我的准备,JBOSS 是一个 EJB 容器(?)。我不确定我使用的是什么 servletcontainer。当我发现我的 servletcontainer 是什么时,我将不得不再次发布。 JBoss 是一个应用服务器。它使用 Tomcat 作为 servlet 容器,并在此基础上添加了一些 EJB 和其他花哨的 JavaEE 功能。 EJB 故事在这里无关紧要。这是一个 HTTP/Servlet 问题。顺便说一句,我不确定旧的 JBoss 4.0 是否支持这个属性……至少,说明与 Tomcat 相同。 看起来连 JBoss 4.3 都不支持,你需要 5.0:issues.jboss.org/browse/JBPAPP-3088【参考方案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

我在过滤器中测试它

【讨论】:

以上是关于在 JSESSIONID cookie 中设置 httponly (Java EE 5)的主要内容,如果未能解决你的问题,请参考以下文章

跨域请求传递Cookie问题

接口测试之保持登录状态

从 servlet 读取整个 url

如何在 ApplicationController 中设置 cookie?

如何在 Wordpress 中设置 cookie

在 wcf 服务中设置 cookie