I'm starting from What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
I have a pre render view event listener:
<f:metadata>
<f:event type="preRenderView" listener="#{loginBean.performWeakLogin()}" />
</f:metadata>
which invokes the following method:
public String performWeakLogin() {
FacesContext facesContext = FacesContext.getCurrentInstance();
String parameter_value = (String) facesContext.getExternalContext().getRequestParameterMap().get("txtName");
if (parameter_value != null && parameter_value.equalsIgnoreCase("pippo")) {
try {
return "mainPortal";
} catch (IOException ex) {
return null;
}
} else {
return null;
}
}
and the following navigation rule:
<navigation-rule>
<from-view-id>/stdPortal/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>mainPortal</from-outcome>
<to-view-id>/stdPortal/stdPages/mainPortal.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
However, it doesn't perform the navigation. It works when I use a command button as follows:
<p:commandButton ... action="#{loginBean.performWeakLogin()}" />
Navigation based on a method's return value is only performed by components implementing
ActionSource2interface and providing an attribute taking aMethodExpressionfor that, such asactionattribute ofUICommandcomponents, which is queued during Apply Request Values phase and invoked during Invoke Application phase.The
<f:event listener>is merely a component system event listener method, not an action method. You need to perform the navigation manually as follows:Alternatively, you can also send a redirect on a given URL, which is more useful for the case you don't want to navigate internally, but externally:
Unrelated to the concrete problem, a servlet filter is a better place for the job of performing request based authorization/authentication.
See also: