我在帖子How do you configure HttpOnly cookies in tomcat / java webapps?上看到Tomcat 5.5。(> 28)应支持useHttpOnly
元素中指定的供应商特定<Context>
属性。
我将此属性添加到我的server.xml中配置的所有上下文。
但是,只有JSESSIONID
附加了"; httpOnly"
标记。所有其他Cookie与我添加useHttpOnly="true"
之前的完全一样。
Set-Cookie=
JSESSIONID=25E8F...; Path=/custompath; HttpOnly
mycustomcookie1=xxxxxxx; Path=/
mycustomcookie2=1351101062602; Path=/
mycustomcookie3=0; Path=/
mycustomcookie4=1; Path=/; Secure
mycustomcookie5=4000; Expires=Sat, 22-Oct-2022 17:51:02 GMT; Path=/
还有什么我需要改变吗?
(升级到tomcat 6或7现在不是一个选项。我们的系统使用基于tomcat 5.5的第三方框架)
答案 0 :(得分:1)
服务器中的useHttpOnly
配置确实仅适用于服务器控制的Cookie,例如JSESSIONID
。
对于webapp控制的cookie,您需要自己手动创建整个cookie标头。 Cookie
类不适合,因为在Servlet 3.0中引入了setHttpOnly()
方法,但是你使用Tomcat 5.5作为Servlet 2.4容器在Cookie
类中没有这个方法。您需要升级到至少Tomcat 7,这是一个与Servlet 3.0兼容的容器。
您可以在问题中手动创建cookie,如下所示:
response.addHeader("Set-Cookie", "mycustomcookie1=xxxxxxx; Path=/; HttpOnly");
response.addHeader("Set-Cookie", "mycustomcookie2=1351101062602; Path=/; HttpOnly");
response.addHeader("Set-Cookie", "mycustomcookie3=0; Path=/; HttpOnly");
response.addHeader("Set-Cookie", "mycustomcookie4=1; Path=/; Secure; HttpOnly");
response.addHeader("Set-Cookie", "mycustomcookie5=4000; Expires=Sat, 22-Oct-2022 17:51:02 GMT; Path=/; HttpOnly");
确实只需将HttpOnly
属性添加到Cookie标头值,由;
分隔。
如果您希望在所有 Cookie上透明地应用此功能,那么您可能希望提供其中addHeader()
和setHeader()
方法的自定义HttpServletResponseWrapper
因此被覆盖以检查是否已设置Set-Cookie
标头,如果已设置,则在缺席时将;HttpOnly
添加到该值。这样您就可以继续使用addCookie()
。