2012-03-27 54 views
1

我目前正在開發一個支持多種語言的項目。爲了使用戶更友好,我正在嘗試重定向與其語言環境相對應的用戶子域(或他們的首選語言)。Grails項目中不同子域的會話和會話ID相同 - 我該怎麼做?

也就是說,我的項目的URL是mydomain.com,我和子域en.mydomain.comes.mydomain.comde.mydomain.comfr.mydomain工作。 com ...你明白了。現在,所有子域都由相同的grails應用程序提供服務。

會發生什麼事是,我的Grails項目能在不同的會議(由會話ID來看)爲每一個子域,因此,信息丟失,當語言之間的用戶切換。我沒有忘記這一點。 :(

我如何能明確設置會話標識符?我想這是僅基於mydomain.com

我得到了暗示的Apache Tomcat提供類似

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

,但這並不有助於開發環境等

任何提示?您是否嘗試將會話信息存儲在數據庫中?有時用於負載平衡的目的,這可能也有幫助嗎? !

幫助非常感謝(一如既往)!乾杯!

回答

0

我不認爲你可以分享不同的上下文根之間的會話更不用說子域。 對於負載平衡,大多數配置使用粘性會話,其中相同的會話請求被定向到相同的應用服務器。有配置可以在負載平衡器下跨羣集複製會話,以便爲後續請求切換服務器。

您有幾種選擇在這裏:

  1. 詢問具體到Apache URL重寫規則的一個問題,如果他們可以在一個URL重寫維護HTTP會話。

  2. 放棄的子域的方法和使用他們的瀏覽器語言環境嗅出了什麼樣的信息包使用。 (我喜歡這種方法)

  3. (以前是2 :))探索把會話信息在跨越域可讀的cookie。我知道跨域cookies不允許,但子域名應該沒問題。

+0

其實選項2是我想探索的。這就是爲什麼我建議_sessionCookieDomain_作爲可能的解決方案。然而,我不知道,我怎麼能爲grails devel(不在tomcat中運行)做到這一點? – fluxon 2012-03-28 09:40:30

+0

非常感謝您回答btw。 – fluxon 2012-03-28 09:40:45

+0

餅乾相當簡單,你不需要apache或什麼不規則。瀏覽器處理cookie處理,JavaScript可以在客戶端處理您的Cookie。在服務器端你有你的標籤:http://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) – dbrin 2012-03-28 17:18:52

0

一個解決它的辦法,是使用nginx的在你的tomcat前面的反向代理和翻譯從fr.mydomain.comlocalhost/yourapplication/fr/什麼請求。

他會關心你的cookies。我附加了一個示例配置(稍微縮短),我曾經使用過:

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