我刚刚经历了所有这些寻找一个简单的解决方案。我首先从tomcat的角度开始看它。
Tomcat 不提供直接访问为会话配置域 cookie 的权限,我绝对不想自定义补丁 tomcat 来解决该问题,如其他一些帖子所示。
由于访问 Servlet 规范中内置的标头和 cookie 的限制,tomcat 中的阀门似乎也是一个问题解决方案。如果 http 响应在传递到您的阀门之前提交,它们也会完全失败。
由于我们通过 Apache 代理我们的请求,因此我转而讨论如何使用 apache 来解决问题。
我首先尝试了 mod_proxy 指令 ProxyPassReverseCookieDomain,但它不适用于 JSESSIONID cookie,因为 tomcat 没有设置域属性,并且如果没有某种域作为 cookie 的一部分,ProxyPassReverseCookieDomain 就无法工作。
我还遇到了一个使用 ProxyPassReverseCookiePath 的黑客攻击,他们正在重写路径以向 cookie 添加域属性,但这对于生产站点来说感觉很混乱。
我终于通过使用上面 Dave 提到的 apache 中的 mod_headers 模块重写响应头来让它工作。
我在虚拟主机定义中添加了以下行:
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"
以上都应该是配置中的一行。它将任何 JSESSIONID cookie 域属性替换为“.example.com”。如果 JSESSIONID cookie 不包含域属性,则该模式将添加一个值为“.example.com”的。作为奖励,此解决方案不会受到阀门的双 JSESSION cookie 问题的影响。
该模式应该适用于 Set-Cookie 标头中的多个 cookie,而不会影响标头中的其他 cookie。通过将模式第一部分中的 JSESSIONID 更改为您想要的任何 cookie 名称,它也应该可以修改以与其他 cookie 一起使用。
我不是 reg-ex 高级用户,所以我确信可以对模式进行一些优化,但到目前为止它似乎对我们有用。
如果我发现该模式有任何错误,我会更新这篇文章。希望这将阻止你们中的一些人像我一样经历过去几天的挫折。