Grails项目中不同子域的相同会话和会话ID - 我该怎么做?

时间:2012-03-27 17:25:51

标签: session grails subdomain

我目前正在开发一个支持多种语言的项目。为了对seo友好,我正在尝试重定向与其区域设置(或其首选语言)对应的用户子域。

即,我的项目的网址是 mydomain.com ,我使用子域 en.mydomain.com es.mydomain.com de.mydomain.com fr.mydomain.com ...你明白了。所有子域名目前都由相同的grails应用程序提供。

我的grails项目会为每个子域维护不同的会话(由会话ID看到),因此当用户在语言之间切换时,信息会丢失。我没有预见到这一点。 :(

如何显式设置会话标识符?我希望它基于 mydomain.com

我得到了Apache Tomcat提供类似

的提示
<Context sessionCookiePath="/" sessionCookieDomain=".mydomain.com"> 

,但这对开发环境等没有帮助。

任何提示?您是否尝试在数据库中存储会话信息?这有时用于负载平衡目的,也可能有帮助吗?!

非常感谢帮助(一如既往)!干杯!

2 个答案:

答案 0 :(得分:0)

我认为您不能在不同的上下文根之间共享会话,更不用说子域了。 对于负载平衡,大多数配置使用粘性会话,其中相同的会话请求被定向到同一个应用服务器。有一些配置可以在负载均衡器下跨群集复制会话,以便为后续请求切换服务器。

这里有几个选项:

  1. 如果他们可以在网址重写中保留http会话,请提出一个特定于apache网址重写规则的问题。

  2. 放弃子域方法并使用其浏览器区域设置来嗅出要使用的消息包。 (我喜欢这种方法)

  3. (曾经是2 :))探讨将会话信息放在域中可读的cookie中。我知道不允许跨域cookie,但子域名应该没问题。

答案 1 :(得分:0)

解决问题的一种方法是在tomcat前面使用nginx作为反向代理,并将请求从fr.mydomain.com转换为localhost/yourapplication/fr/或其他内容。

他会关心你的饼干。我附加了一个示例配置(稍微缩短了),我曾经使用过一次:

server {
    server_name  fr.yourdomain.com;
    location /office {
        proxy_pass        http://localhost:8080/yourapplication/fr;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
    }
}

server {
   server_name  es.yourdomain.com;
    location /office {
        proxy_pass        http://localhost:8080/yourapplication/es;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
    }
}
[..]