所以我正在开发一个Java Web应用程序,为此我最近实现了一个依赖于JSESSIONID cookie识别用户的authentication模块。 我在eclipse上testing了一个本地的tomcat,并且一切正常……直到我用一些更高级的安装结构在我们的VPS(Centos)上部署应用程序:
Apache HTTP服务器
几个虚拟主机
所述webapp被安装在具有mod_jk的虚拟主机中。 目前通过“sub.hostname.com/WEBAPP_NAME/home”进行访问,但应该以“sub.hostname.com/home”提供。
上面的设置在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>