2012-05-16 96 views
0

我終於把我的應用程序部署到apache/mod_jk負載平衡前端的2實例單節點測試羣集。Glassfish 3.1.2 - 創建羣集和部署應用程序後j_security_check循環

在非集羣環境中,我一直在使用JDBCRealm的容器安全性,並且它的工作可靠。

在集羣環境中,我在瀏覽器中獲取登錄頁面,輸入有效的用戶名和密碼,單擊提交按鈕,j_security_check將響應頭中的位置頁面設置爲登錄頁面,而不是歡迎文件。它轉向我們剛剛登錄的頁面。

我已啓用MySQL通用查詢日誌,可以看到密碼&正在從正確的用戶右表讀取組名。

我試着設置javax.enterprise.system.core.security.level = FINEST,但服務器日誌中仍然沒有輸出。

通過將相同的應用程序部署到本地服務器而不是羣集,我可以訪問localhost:8080 /並且登錄成功。如果我只輸入「localhost」並通過負載平衡器,它將不起作用。

我知道j_security_check可以轉發到觸發身份驗證的頁面(這可能是這裏發生的事情),但是當它沒有「觸發身份驗證的頁面」時,它何時轉發到歡迎文件? 編輯:我現在看到,它總是302重定向到referer,這是在這種情況下的上下文根。容器必須有一些規則來確定哪個頁面實際顯示。在我的集羣示例中,它不是web.xml中的歡迎文件。

我還設置我的集羣config認證領域:

asadmin> create-auth-realm --target c1 --classname com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm --property jaas-context=jdbcRealm:datasource-jndi=jdbc/sportquest:user-table=users:user-name-column=username:password-column=password:group-table=users:group-name-column=groupname:digest-algorithm=SHA-256:encoding=Base64 

我能想到的兩個環境之間的唯一區別是,在羣集安裝我有一個從http fowards一個mod_rewrite的規則 - > HTTPS(httpd.conf文件):

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

# This redirects from thingy.com to www.thingy.com 
# 
RewriteCond %{HTTP_HOST} !^thingy\.com$ [NC] 
RewriteRule ^(.*)$ %{HTTPS}://thingy.com/$1 [R=301,L] 

編輯:添加下面Chrome瀏覽器開發工具,網絡跟蹤

工作方案部署/ MyApp的:

GET http://localhost:8080/MyApp - 301 Moved Permanently (from cache) 
GET http://localhost:8080/MyApp/ - 200 Ok 
... login page loads ... 
POST http://localhost:8080/MyApp/j_security_check - 302 Moved Temporarily 
    the form data contains user/pass as expected & response header Location: 
    http://localhost:8080/MyApp/ 
GET http://localhost:8080/MyApp/ - 200 Ok 
... welcome-file page loads ... 

的不工作的情況(羣)部署爲根/:

GET http://localhost/ - 301 Moved Permanently (from cache) 
GET https://localhost/ - 200 Ok 
... login page loads ... 
POST https://localhost/j_security_check - 302 Moved Temporarily 
    the form data contains user/pass as expected & response header Location: 
    https://localhost/ 
GET https://localhost/ - 200 Ok 
... the login page loads ... 

如果我在無效的登錄證書,那麼在這兩種情況下I型成功重定向到表單錯誤頁面。

任何人有任何建議嗎?我只是沒有看到它。謝謝。

p.s.我確實嘗試了瀏覽器緩存清理,沒有幫助!

更新:的問題是,在聚集/ mod_jk的環境從j_security_check回發了一個Set-Cookie用新的SessionID,所以當下一個請求出現在不同的會話。這似乎是與粘滯的會議,但我仍然不知道如何解決它。我已經嘗試將loadbalancer sticky_sessions設置爲true和false,但都沒有幫助。

jvmRoute爲兩個實例都設置給工作人員。

回答

0

爲什麼不直接用mod_proxy & mod_proxy_balancer代替?這樣你可以爲不同的上下文根設置反向cookie路徑。讓我知道你是否需要一些配置示例(在iPhone atm上)

相關問題