我正在开发一个 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 路径。