2012-12-21 113 views
5

在我的JSF應用程序中,有一個Filter用於檢查認證過程。當身份驗證失敗時,篩選器將重定向到login.xhtml按過濾器設置FacesMessage

如何將FacesMessageFilter傳遞到我的登錄頁面?

雖然,我在下面使用,它不是。

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 

AuthenticationFilter.java

​​

回答

7

FacesContextFacesServlet創建。當你在一個過濾器中時,它還沒有被調用。過濾器在servlet之前運行。所以你永遠不會在過濾器中碰到FacesContext。另外,faces消息是請求作用域的,所以重定向會使它們消失。

login.xhtml<f:event type="preRenderView">期間自行設置它。最簡單的方法是讓過濾器將其暫時放在會話範圍內。

session.setAttribute("message", message); 
httpResponse.sendRedirect(loginView); 

,你再從session範圍在login.xhtml預渲染視圖監聽方法去除:

String message = (String) externalContext.getSessionMap().remove("message"); 

if (message != null) { 
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 
} 
+0

感謝您的支持。 – CycDemo

+0

不客氣。 – BalusC

0

我碰到了類似的問題,試圖讓FacesContext中的EJB計時器。 BalusC在多個主題上指出,這是不可能的。或者,您可以使用'ServletContextListener',但ScheduledExecutorService不像EJB定時器那樣很好地定義調度。

在任何情況下,他提出的一個建議是實際向由受管Bean支持的JSF分頁發出Web請求,以利用我想用計時器設置的應用程序範圍bean上的方法。

我提到這一點,因爲它看起來像你可以做類似的事情,在那裏你傳遞一個參數到JSF頁面,並且你想要的消息和用戶的IP地址等等。該頁面可以由請求作用域bean支持,該請求作用域bean具有注入到其中的應用程序作用域Bean,該應用程序作用域將其存儲在以IP爲關鍵字的映射中。然後,當用戶被重定向到登錄頁面時,該頁面可以在請求作用域bean上調用get錯誤消息方法,該方法注入了相同的應用程序作用域bean,從而獲得該IP的錯誤消息或沿着這些行的東西。

在任何情況下,我確信BalusC的回答是足夠的,比這更合適,但他'只是從ejb計時器'提出請求,對我來說很適合在應用程序範圍的bean上調度方法調用,而我我認爲我可能在這裏提出它的可能用途。

@BalusC你對我提到的文章有什麼想法嗎?我無法找到它。