我刚刚经历了所有这些,寻找一个简单的解决方案。我首先开始从雄猫的角度来看待它。
Tomcat不直接访问为会话配置域cookie的权限,我绝对不想自定义补丁tomcat来修复该问题,如其他一些帖子所示。
Tomcat 中的 Valves 似乎也是一个问题解决方案,因为 Servlet 规范中内置了对访问标头和 cookie 的限制。如果 http 响应在传递到您的阀门之前提交,它们也会完全失败。
由于我们通过Apache代理我们的请求,因此我转向了如何使用apache来解决问题。
我首先尝试了mod_proxy指令ProxyPassReverseCookieDomain,但它不适用于JSESSIONID Cookie,因为tomcat没有设置域属性,并且ProxyPassReverseCookieDomain如果没有某种域作为cookie的一部分就无法工作。
我还遇到了一个使用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 cookies域属性。如果 JSESSIONID Cookie 不包含域属性,则该模式将添加一个值为“.example.com”的属性。作为奖励,此解决方案不会受到阀门的双重JSESSION cookies问题的困扰。
该模式应适用于 Set-Cookie 标头中的多个 Cookie,而不会影响标头中的其他 Cookie。它还应该可以通过将模式第一部分中的JSESSIONID更改为您想要的任何cookie名称来修改以与其他cookie一起使用。
我不是注册高级用户,因此我确信可以对模式进行一些优化,但到目前为止,它似乎对我们有用。
如果我发现该模式有任何错误,我将更新这篇文章。希望这能阻止你们中的一些人像我一样经历最后几天的挫折。