24

我的 Web 应用程序在 Tomcat 中运行,http://localhost:8080/example.com/但它正在从http://example.com/在端口 80 上提供服务的 Apache 进行反向代理。我的 Web 应用程序查看request.getHeader("x-forwarded-host")标头以知道它位于反向代理后面。当它(动态地)检测到这一点时,它会构建没有 servlet 路径的 URL。

这适用于除 JSESSIONID cookie 之外的所有内容。当通过反向代理访问它时,它被设置为路径/example.com而不是。当请求/中有标头时,我不知道如何让我的代码告诉 Tomcat 覆盖该 cookie 的路径。x-forwarded-host

我自己尝试从网络应用程序中设置 JSESSIONID cookie,但这只会产生两个 Set-Cookie 标头,其中只有一个是正确的。

4

3 回答 3

37

Tomcat6 使用 Servlet 2.3 规范。它不支持通过代码或 Tomcat 配置更改 cookie 路径。

我通过一些mod_proxy指令让它在 Apache 端工作。该ProxyPassReverseCookiePath指令完全符合我的要求。它从 Tomcat 中获取路径不正确的 cookie,并将其重写为正确的路径。

<VirtualHost *:*>
    Servername example.com
    ProxyRequests Off
    ProxyPass / http://localhost:8080/example.com/
    ProxyPassReverseCookiePath /example.com /
    ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>
于 2012-02-28T17:57:27.703 回答
8

或者将节点/Context(文件:/conf/context.xml)的属性sessionCookiePath设置为“/”:

<Context sessionCookiePath="/">

看看: http: //tomcat.apache.org/tomcat-7.0-doc/config/context.html了解更多信息

于 2013-09-24T15:44:30.533 回答
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 版。

于 2013-09-25T18:18:36.330 回答