【问题标题】:How to properly set JSESSIONID cookie path behind reverse proxy如何正确设置反向代理后面的 JSESSIONID cookie 路径
【发布时间】:2024-04-16 04:10:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: tomcat reverse-proxy jsessionid


    【解决方案1】:

    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>
    

    【讨论】:

      【解决方案2】:

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

      <Context sessionCookiePath="/">
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          最近更新 更多