2010-06-07 123 views
11

我试图在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头中,并与对象一起添加到请求中。

我很乐意发布一些代码,但我想排除我的困难源自对理论的误解。

+0

rwise这是一个无法接近的墙文本。可能仍然会考虑发布您尝试过的示例代码。 – 2010-06-07 19:35:01

回答

10

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

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

也看到这个Tomcat documentation有关<Context>元素。

+0

我越探究这个话题,我就越意识到我几乎所有的事情都是完全无知的。我使用的是JBOSS 4.0,但是从我已经准备好的,JBOSS是一个EJB容器(?)。我不确定我使用的是什么servletcontainer。当我发现我的servletcontainer是什么时,我将不得不再次发布。 – Mythandros 2010-06-15 15:21:34

+0

JBoss是一个应用程序服务器。它使用Tomcat作为servlet容器,并在其上增加了一些EJB和其他花哨的JavaEE功能。 EJB的故事在这里是无关紧要的。这是一个HTTP/Servlet问题。顺便说一句,我不确定旧的JBoss 4.0是否支持这个属性......至少,这些指令与Tomcat相同。 – BalusC 2010-06-15 15:37:05

+0

看起来连JBoss 4.3都不支持,你需要5.0:https://问题。jboss.org/browse/JBPAPP-3088 – 2011-02-10 16:44:21

5

您可以使用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

我测试到增加了一些代码格式化,因为行吟诗人过滤

相关问题