在 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 关于<Context>
元素。
【讨论】:
我对这个话题的探索越多,我就越意识到自己对几乎所有事情都一无所知。我正在使用 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)的主要内容,如果未能解决你的问题,请参考以下文章