如何在反向代理后面正确设置JSESSIONID cookie路径

时间:2012-02-28 17:12:04

标签: tomcat reverse-proxy jsessionid

我的网络应用程序在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标头,其中只有一个是正确的。

3 个答案:

答案 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版。