這是我的使用案例。Seam 3如何在登錄後處理「重定向捕獲視圖」功能?
我有一個登錄頁面,它是/public/login.xhtml
。我的所有其他頁面在到達之前都需要登錄。他們在/pages/
目錄中。
我想的是:
- 如果我到
http://host/myapp/pages/*
用戶訪問它首先他重定向到登錄頁面,然後,到了URL,他首先進入。 - 如果我的用戶訪問
http://host/myapp/
,它會首先將其重定向到登錄頁面,然後再重定向到/pages/home.xhtml
。 - 如果我的用戶訪問
http://host/myapp/public/login.xhtml
,它會首先將其重定向到登錄頁面,然後再重定向到/pages/home.xhtml
。 - 如果我到
http://host/myapp/public/login.xhtml
用戶訪問,並已登錄,它重定向到/pages/home.xhtml
。
什麼是目前的工作?
有縫3(v3.1.0.Final)和安全+面孔模塊,我的使用情況N°1是自動工作有:
@ViewConfig
public interface PagesConfig {
static enum Pages {
@ViewPattern("/pages/*")
@LoginView("/public/login.xhtml")
@LoggedIn
LOGGED_IN_PAGES,
}
}
我的問題是我不瞭解Seam如何將重定向到「捕獲視圖」。
使用Seam 2,這是很容易理解,在components.xml
我們有
<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}" />
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}" />
</event>
所以我們捕獲的事件notLoggedIn
和loginSuccessful
來處理與redirect
組件。
在接縫3,我沒有發現配置:似乎沒有任何@Observes LoggedInEvent
,並沒有Redirect
類...
的點n°2已與/index.htm
文件來實現的:
<html><head>
<meta http-equiv="Refresh" content="0; URL=pages/home.xhtml">
</head></html>
但是對於我的點n°3,我已經嘗試過不能完全工作的解決方案。
首先我想在login.xhtml
:
<f:metadata>
<s:viewAction action="#{loginAction.redirectToHome}" if="#{identity.loggedIn}" immediate="true" />
</f:metadata>
及有無onPostback="true"
,我登錄後,我仍然在與該錯誤信息的登錄頁面(兩次):「無法找到匹配導航的情況下從-view-id的«/public/login.xhtml»行動«#{} identity.login»與預後«成功»。」。只有當我重新訪問http://host/myapp/public/login.xhtml
時,我的viewAction
纔會將我重定向到家中。
我也試過了導航規則faces-config.xml
:
<navigation-rule>
<from-view-id>/public/login.xhtml</from-view-id>
<navigation-case>
<if>#{identity.loggedIn}</if>
<to-view-id>/pages/home.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
但後來,我用例N°1被禁用:每次我登錄時,我被重定向到家裏。
最後,對於我的點n°4,s:viewAction
完成這項工作。
所以不會有人知道,以正確處理這4個用例(我想這是常見的用例)的最佳實踐,特別是點N°3?
感謝您的回覆,我試圖實現您的1)解決方案,但要做到這一點,我必須禁用Seam的LoginListener以使用我的...並且我無法做到這一點: (這是我現在面臨的:http://stackoverflow.com/questions/9332311/how-to-use-alternative-extending-a-concrete-class-in-a-webapp – 2012-02-20 13:13:48
@AnthonyO。我想你誤解了解決方案1)。沒有必要替換LoginListener。相反,在執行登錄邏輯的\ @Secures方法中,您可以操縱Seam Faces哈希映射。放心,這是一個解決方法,而不是*應該如何工作。 – 2012-02-20 15:08:39