在JSESSIONID Cookie中设置httponly(Java EE 5)
我试图在JSESSIONID cookie上设置httponly标志。但是,我正在使用Java EE 5,但不能使用setHttpOnly()
。首先,我尝试使用response.setHeader()
从servlet的doPost()
中创建我自己的JSESSIONID cookie。在JSESSIONID Cookie中设置httponly(Java EE 5)
当这没有奏效,我试了response.addHeader()
。那也行不通。然后,我了解到servlet处理将会话转换为JSESSIONID cookie并将其插入到http头中,因此如果我想使用该cookie,则必须编写一个过滤器。我写了一个过滤器,并在那里玩setHeader()
/addHeader()
,再次无济于事。
然后,我了解到,有一个在响应对象回事它到达过滤器之前,所以如果我要处理的数据,我需要延长HttpServletResponseWrapper
,并传递到filterChain.doFilter()
一些冲洗/关闭动作。这样做,但我仍然没有得到结果。显然我做错了什么,但我不知道是什么。
我不确定这是否与手边的问题完全相关,但是servlet没有将任何html文档返回给浏览器。真正发生的是一些对象正在被填充并返回给JSP文档。我曾假设Session对象变成了一个JSESSIONID cookie,并且在发送到浏览器之前,将其包装在一个http头中,并与对象一起添加到请求中。
我很乐意发布一些代码,但我想排除我的困难源自对理论的误解。
由于JSESSIONID
cookie由servletcontainer管理,因此此设置是特定于servletcontainer的。目前还不清楚您使用的是哪一个,所以这里有一个Apache Tomcat 6.0目标回答,以便您知道在哪个方向上您必须查找您的servlet容器:您需要将网络应用程序的<Context>
元素的useHttpOnly
属性设置为true
。
<Context useHttpOnly="true">
...
</Context>
也看到这个Tomcat documentation有关<Context>
元素。
我越探究这个话题,我就越意识到我几乎所有的事情都是完全无知的。我使用的是JBOSS 4.0,但是从我已经准备好的,JBOSS是一个EJB容器(?)。我不确定我使用的是什么servletcontainer。当我发现我的servletcontainer是什么时,我将不得不再次发布。 – Mythandros 2010-06-15 15:21:34
JBoss是一个应用程序服务器。它使用Tomcat作为servlet容器,并在其上增加了一些EJB和其他花哨的JavaEE功能。 EJB的故事在这里是无关紧要的。这是一个HTTP/Servlet问题。顺便说一句,我不确定旧的JBoss 4.0是否支持这个属性......至少,这些指令与Tomcat相同。 – BalusC 2010-06-15 15:37:05
看起来连JBoss 4.3都不支持,你需要5.0:https://问题。jboss.org/browse/JBPAPP-3088 – 2011-02-10 16:44:21
您可以使用Java EE 5使用:
对于Java企业版之前的版本Java EE 6的一个共同的解决办法是,明确追加会话cookie值仅Http覆盖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
我测试到增加了一些代码格式化,因为行吟诗人过滤
rwise这是一个无法接近的墙文本。可能仍然会考虑发布您尝试过的示例代码。 – 2010-06-07 19:35:01