13

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

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

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

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

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

4

2 回答 2

11

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

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

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

于 2010-06-07T20:00:11.933 回答
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");

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

我在过滤器中测试它

于 2013-06-21T11:24:34.830 回答