带有Tomcat的Apache httpd mod_rewrite导致JSESSIONID丢失

所以我正在开发一个Java Web应用程序,为此我最近实现了一个依赖于JSESSIONID cookie识别用户的authentication模块。 我在eclipse上testing了一个本地的tomcat,并且一切正常……直到我用一些更高级的安装结构在我们的VPS(Centos)上部署应用程序:

上面的设置在authentication更新之前并不是什么大问题(顺便说一下,之前的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> 

问题:部署之后,validation将不起作用,因为JSESSIONID cookie没有写入。 我删除了RewriteRules并通过'sub.hostname.com/WEBAPP_NAME/home'访问应用程序,在那里一切正常,我收到一个cookie。 从这些观察,我猜这个问题是由于URL被重写,而Servlet不会将cookie写入正确的path(?)如果是这样的话,我应该尝试从应用程序内写入cookie到其他path?

问题:我接受关于解决scheme的所有build议。 请裸露在我身上,因为我(显然)不是服务器设置的专家。 有没有什么具体的设置,可以在apache或tomcat中处理呢? 还是我最初select了错误的安装架构?

提前感谢!

您可以select更改Cookiepath。

这里的问题是你的apache conf中的rewrite_rule和tomcat将cookiepath设置为/ WEBAPP_NAME /。

在tomcat中,您可以使用上下文中的sessionCookiePath属性更改cookiepath。

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

而且有可能mod_rewrite可以用来改变cookie的path。

在阅读CédricC的build议之后,我做了一些更深入的研究,发现这一点: configurationApache,Tomcat,mod_jk和mod_rewrite从顶层提供tomcat

我按照Kevin Loney的说明使用mod_headers模块直接从Apache修改http头。

最后,我只需/WEBAPP_NAME添加到我的VirtualHostconfiguration中, /WEBAPP_NAME所有cookiepath更改为/ (root)

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

替代方法 – 从Tomcat更改cookiepath:

我还testing了在我的应用程序的web.xml中设置来自Tomcat的Cookiepath:

 <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> 

https://stackoverflow.com/questions/12755499/how-to-change-jsessionid-cookie-path-to-server-root-in-spring-app-on-jetty上得到了web.xml的例&#x5B50;