Session Grails项目中不同子域的相同会话和会话ID-我如何做到这一点?

Session Grails项目中不同子域的相同会话和会话ID-我如何做到这一点?,session,grails,subdomain,Session,Grails,Subdomain,我目前正在从事一个支持多种语言的项目。为了便于搜索引擎优化,我正在尝试重定向用户与其区域设置(或首选语言)相对应的子域 也就是说,我的项目的url是mydomain.com,我与子域en.mydomain.com、es.mydomain.com、de.mydomain.com、fr.mydomain.com一起工作。。。你明白了。目前,所有子域都由同一个grails应用程序提供服务 发生的情况是,我的grails项目为每个子域维护不同的会话(如会话ID所示),因此当用户在语言之间切换时,信息丢失

我目前正在从事一个支持多种语言的项目。为了便于搜索引擎优化,我正在尝试重定向用户与其区域设置(或首选语言)相对应的子域

也就是说,我的项目的url是mydomain.com,我与子域en.mydomain.com、es.mydomain.com、de.mydomain.com、fr.mydomain.com一起工作。。。你明白了。目前,所有子域都由同一个grails应用程序提供服务

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

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

我得到了ApacheTomcat提供类似

<Context sessionCookiePath="/" sessionCookieDomain=".mydomain.com"> 

,但这对devel环境等没有帮助

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


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

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

您在这里有几个选项:

  • 如果apache URL重写规则可以在URL重写过程中保留http会话,请询问特定于这些规则的问题

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

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


  • 解决这个问题的一种方法是,在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;
        }
    }
    [..]
    

    实际上,选项2是我想要探索的。这就是为什么我建议SessionOkieDomain作为一个可能的解决方案。但是,我不知道如何为grails-devel(不在tomcat中运行)做到这一点?!非常感谢您的回答。顺便说一句,cookies非常简单,您不需要apache或其他规则。浏览器处理cookie处理,JavaScript可以在客户端处理cookie。在服务器端,您得到了标签:,甚至还有一个cookie插件:)。您可以使用:request.cookies.each{println”${it.name}==${it.value}----和set----def c=new Cookie(someName,someValue)c.maxAge=someNumberInSeconds response.addCookie(c)