在JSESSIONID cookie中设置httponly(Java EE 5)
我正在尝试在JSESSIONID cookie上设置httponly标志。 但是,我在Java EE 5中工作,不能使用setHttpOnly()
。 首先,我尝试使用response.setHeader()
从servlet的doPost()
创建自己的JSESSIONID cookie。
当这不起作用时,我尝试了response.addHeader()
。 那也行不通。 然后,我了解到servlet处理将会话转换为JSESSIONID cookie并将其插入http头中,因此如果我想使用该cookie,我将不得不编写一个filter。 我写了一个filter并在setHeader()
玩setHeader()
/ addHeader()
,再次无济于事。
然后,我了解到响应对象在进入filter之前有一些刷新/关闭动作,所以如果我想操纵数据,我需要扩展HttpServletResponseWrapper
并将其传递给filterChain.doFilter()
。 这已经完成,但我仍然没有得到结果。 显然,我做错了什么,但我不知道是什么。
我不确定这与手头的问题是否完全相关,但是servlet没有向浏览器返回html文档。 所有真正发生的事情是正在填充一些对象并将其返回到JSP文档。 我有点假设Session对象被转换为JSESSIONID cookie,并在发送到浏览器之前将其与添加到请求中的对象一起包装在http标头中。
我很乐意发布一些代码,但我想排除我的困难可能源于对理论的误解。
由于JSESSIONID
cookie由servletcontainer管理,因此该设置是特定于servletcontainer的。 目前还不清楚你正在使用哪一个,所以这里是一个Apache Tomcat 6.0目标答案,这样你就知道你需要在哪个方向寻找你的servletcontainer:你需要将webapplication的
元素的useHttpOnly
属性设置为true
。
...
另请参阅有关
元素的Tomcat文档 。
您可以在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
我把它测试成一个filter