2012-12-21 37 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你对我提到的文章有什么想法吗?我无法找到它。