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

24

我的Web应用在Tomcat中运行,地址为:http://localhost:8080/example.com/,但是它被反向代理从80端口的Apache服务器上提供的http://example.com/转发。我的Web应用检查request.getHeader("x-forwarded-host")头信息来判断它是否在反向代理后面。当它(动态地)检测到这一点后,会在URL中构建不包含servlet路径的链接。

这对除了JSESSIONID cookie以外的所有内容都有效。但是,当通过反向代理访问时,JSESSIONID cookie设置的路径为/example.com而不是/。我无法弄清楚如何让我的代码在请求中有x-forwarded-host头信息时告诉Tomcat覆盖该Cookie的路径。

我尝试过在Web应用程序中自己设置JSESSIONID cookie,但结果只会产生两个Set-Cookie头信息,其中只有一个是正确的。

4个回答

39

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

我通过一些mod_proxy指令在Apache端使其工作。 ProxyPassReverseCookiePath指令完全符合我的要求。 它将具有错误路径的cookie从Tomcat获取并重写为正确路径。

<VirtualHost *:*>
    Servername example.com
    ProxyRequests Off
    ProxyPass / http://localhost:8080/example.com/
    ProxyPassReverseCookiePath /example.com /
    ProxyPassReverseCookieDomain localhost example.com
</VirtualHost>

8

5

0
另一种方法是在应用程序端覆盖JESSIONID cookie。
通过这种方式,会发生“巫术”,路径值将被覆盖为用户在浏览器URL中看到的相同值(顺便说一下,这个值是在应用程序上下文中)。
在我的情况下,我通过在登录页面设置此cookie来解决了这个问题。
String cookieExpires = "0"; // you should set a real date here

StringBuilder sb = new StringBuilder("JSESSIONID");
sb.append("=");
sb.append( request.getSession().getId() );  
sb.append("; Expires=");
sb.append(cookieExpires);
sb.append("; Secure; HttpOnly; SameSite=Strict");

response.addHeader("Set-Cookie", sb.toString());

在你出现两个JSESSIONID cookie的情况下,你应该先删除所有的JSESSIONID cookie,然后再添加新的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接