我的网络应用程序在http://localhost:8080/example.com/
的Tomcat中运行,但它正在从端口80上提供http://example.com/
的Apache进行反向代理。我的网络应用程序查看request.getHeader("x-forwarded-host")
标头知道它是反向代理的背后。当它(动态地)检测到它时,它会在没有servlet路径的情况下构建URL。
这适用于除JSESSIONID cookie之外的所有内容。当通过反向代理访问时,它会设置路径/example.com
而不是/
。我无法弄清楚当代码上有x-forwarded-host
标头时,我的代码如何告诉Tomcat覆盖该cookie的路径。
我自己尝试过从Web应用程序设置JSESSIONID cookie,但这只会产生两个Set-Cookie标头,其中只有一个是正确的。
答案 0 :(得分:33)
Tomcat6使用Servlet 2.3规范。它不支持通过代码或Tomcat配置更改cookie路径。
我从Apache端开始使用一些mod_proxy
指令。 ProxyPassReverseCookiePath
指令完全符合我的要求。它从Tomcat获取带有错误路径的cookie,并将其重写为正确的路径。
<VirtualHost *:*>
Servername example.com
ProxyRequests Off
ProxyPass / http://localhost:8080/example.com/
ProxyPassReverseCookiePath /example.com /
ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>
答案 1 :(得分:6)
或者将node / Context(file:/conf/context.xml)的属性sessionCookiePath设置为“/”:
<Context sessionCookiePath="/">
请查看:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html了解更多信息
答案 2 :(得分:5)
Servlet规范3.0版引入了控制会话cookie的功能:http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#getSessionCookieConfig()
SessionCookieConfig scc = getServletContext().getSessionCookieConfig();
scc.setPath("/");
scc.setDomain("example.com");
Tomcat 7使用Servlet规范的第3版。