当前位置:  开发笔记 > 编程语言 > 正文

使用Tomcat允许子域会话cookie的最佳方法

如何解决《使用Tomcat允许子域会话cookie的最佳方法》经验,为你挑选了2个好方法。

默认情况下,tomcat将为当前域创建会话cookie.

如果您在www.example.com上,则会为www.example.com创建您的cookie(仅适用于www.example.com).而对于example.com,它将为.example.com创建(期望的行为,将适用于example.com的任何子域以及example.com本身).

我已经看到一些Tomcat阀门似乎拦截会话cookie的创建并使用正确的.example.com域创建替换cookie,但是它们似乎都没有完美地工作,它们似乎都离开了现有的cookie并且只是创造一个新的.这意味着每个请求都会发送两个JSESSIONID cookie.

我想知道是否有人对此问题有明确的解决方案.



1> 小智..:

这显然是通过6.0.27及以后的配置设置支持的:

通过编辑META-INF/context.xml完成​​配置

https://issues.apache.org/bugzilla/show_bug.cgi?id=48379



2> 小智..:

我刚刚完成了所有这些寻找一个简单的解决方案.我首先从tomcat的角度开始研究它.

Tomcat没有直接访问为会话配置域cookie,我绝对不想自定义修补tomcat来修复该问题,如其他一些帖子所示.

由于访问Servlet规范中内置的标头和cookie的限制,tomcat中的阀门似乎也是一个问题解决方案.如果http响应在传递给您的阀门之前被提交,它们也会完全失败.

由于我们通过Apache代理我们的请求,因此我转而研究如何使用apache来解决问题.

我首先尝试了mod_proxy指令ProxyPassReverseCookieDomain,但它不适用于JSESSIONID cookie,因为tomcat没有设置域属性,并且如果没有某种域作为cookie的一部分,ProxyPassReverseCookieDomain就无法工作.

我还遇到了一个使用ProxyPassReverseCookiePath的黑客攻击,他们在那里重写了向cookie添加域属性的路径,但这让生产网站感到麻烦.

我终于通过使用apache中的mod_headers模块重写响应头来实现它,如上面Dave所述.

我在虚拟主机定义中添加了以下行:

Header edit Set-Cookie "(JSESSIONID\s?=[^;,]+?)((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(;\s?(?:(?i)Domain\s?=)[^;,]+?)?((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(,|$)" "$1$2; Domain=.example.com$4$5"

以上应该都是配置中的单行.它将使用".example.com"替换任何JSESSIONID cookie域属性.如果JSESSIONID cookie不包含域属性,则该模式将添加值为".example.com"的cookie.作为奖励,此解决方案不会受到阀门的双重JSESSION cookie问题的影响.

该模式应该与Set-Cookie标头中的多个Cookie一起使用,而不会影响标头中的其他Cookie.通过将模式的第一部分中的JSESSIONID更改为您想要的cookie名称,它也可以修改为与其他cookie一起使用.

我不是高级用户,因此我确信可以对该模式进行一些优化,但到目前为止它似乎对我们有用.

如果我发现任何有关模式的错误,我会更新这篇文章.希望这会阻止你们中的一些人像过去那样度过最后几天的挫败感.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有