我終於把我的應用程序部署到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爲兩個實例都設置給工作人員。