【问题标题】:Same session and session ID for different subdomains in Grails project - How can I do that?Grails 项目中不同子域的相同会话和会话 ID - 我该怎么做?
【发布时间】:2012-03-27 17:25:51
【问题描述】:

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

即,我的项目的 url 是 mydomain.com,我使用子域 en.mydomain.comes.mydomain.com , de.mydomain.com, fr.mydomain.com ...你明白了。目前所有子域都由同一个 grails 应用程序提供服务。

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

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

我得到了 Apache Tomcat 提供类似

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

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

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

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

【问题讨论】:

    标签: session grails subdomain


    【解决方案1】:

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

    他会关心您的 cookie。我附加了一个示例配置(略短),我使用过一次:

    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;
        }
    }
    [..]
    

    【讨论】:

      【解决方案2】:

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

      你有几个选择:

      1. 问一个特定于 apache URL 重写规则的问题,如果它们可以在 url 重写中保留 http 会话。

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

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

      【讨论】:

      • 其实选项2是我想探索的。这就是为什么我建议将 sessionCookieDomain 作为一种可能的解决方案。但是,我不知道如何为 grails devel(不在 tomcat 中运行)做到这一点?!
      • 非常感谢您的回答。
      • cookies 相当简单,你不需要 apache 或诸如此类的规则。浏览器处理 cookie 处理,JavaScript 可以在客户端操作您的 cookie。在服务器端,你得到了你的标签:grails.org/doc/1.3.x/ref/Tags/cookie.html,甚至还有一个 cookie 插件 :)。您可以使用: request.cookies.each { println "${it.name} == ${it.value} } ------ 并设置 ---- def c = new Cookie(someName, someValue) c .maxAge = someNumberInSeconds response.addCookie(c)
      猜你喜欢
      • 2012-01-30
      • 2012-06-02
      • 1970-01-01
      • 2010-10-01
      • 2012-01-05
      • 2011-02-05
      • 2012-11-08
      • 2015-06-18
      • 2017-04-11
      相关资源
      最近更新 更多