Apache httpd mod_rewrite 与 Tomcat 导致 JSESSIONID 丢失

Apache httpd mod_rewrite 与 Tomcat 导致 JSESSIONID 丢失

我正在开发一个 Java Web 应用程序,最近我为其实现了一个依赖于 JSESSIONID cookie 来识别用户的身份验证模块。我在 eclipse 上的本地 tomcat 上进行了测试,一切正常……直到我在我们的 VPS(Centos)上部署了该应用程序,并使用了一些更高级的设置结构:

  • Apache HTTP 服务器

  • 多个虚拟主机

  • 所述 Web 应用已通过 mod_jk 安装在虚拟主机中。目前可通过“sub.hostname.com/WEBAPP_NAME/home”访问,但应可通过“sub.hostname.com/home”访问。

在身份验证更新之前,上述设置并不是什么大问题(顺便说一句,之前访问是由 tomcat 的安全选项处理的)。旧的 VirtualHost 看起来像这样,并且工作正常:

<VirtualHost *:80>
    ServerName sub.hostname.com
    RewriteEngine on
    RewriteRule ^/(.+)$ /WEBAPP_NAME/$1 [L,PT]
    RewriteRule ^/$ /WEBAPP_NAME/home [L,PT]
    JkMount /* worker
</VirtualHost>

问题:部署后,身份验证无法工作,因为未写入 JSESSIONID cookie。我删除了 RewriteRules 并通过“sub.hostname.com/WEBAPP_NAME/home”访问应用程序,一切又恢复正常,我收到了一个 cookie。根据这些观察,我猜测问题是由于 URL 被重写,而 Servlet 没有将 cookie 写入正确的路径(?)如果是这种情况,我是否应该尝试将 cookie 写入应用程序内的其他路径?

Apache 或 Tomcat 中是否有任何特定设置需要注意才能处理此问题?还是我最初选择了错误的设置架构?

答案1

阅读 CédricC 的建议后,我做了一些研究并发现了这一点:配置 Apache、Tomcat、mod_jk 和 mod_rewrite 以从顶层提供 tomcat 服务

我按照 Kevin Loney 的指示直接修改了 http 标头来自 Apache通过使用mod_headers模块。

最后,我只需要在我的 VirtualHost 配置中添加以下行,将所有 cookie 路径从 更改/WEBAPP_NAME/ (root)

Header edit Set-Cookie "^(.*; Path=)/WEBAPP_NAME/?(.*)" $1/$2

替代方法-从 Tomcat 更改 cookie 路径:

我还测试了在应用程序的 web.xml 中从 Tomcat 设置 cookie 路径:

<session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
        <http-only>true</http-only>
        <path>/</path> <!-- changes the path -->
        <name>COOKIENAME</name>
    </cookie-config>
</session-config>

从以下问题中获取了 web.xml 示例https://stackoverflow.com/questions/12755499/how-to-change-jsessionid-cookie-path-to-server-root-in-spring-app-on-jetty

答案2

您可以通过多种方式来更改 cookie 路径。

这里的问题是您的 apache conf 和 tomcat 中的 rewrite_rule 将 cookie 路径设置为 /WEBAPP_NAME/。

在 tomcat 中,你可以使用以下命令更改 cookie 路径会话Cookie路径上下文中的属性。

您还可以通过将 war 重命名为 ROOT.war 来将您的 webapp 部署到 /。

并且可能可以使用 mod_rewrite 来改变 cookie 路径。

相关内容