Olá,
Tenho uma aplicação JSF 2.0 com primefaces 2.2.1 e estou com o seguinte problema:
Utilizo o phaseListener para redirecionamento quando a sessão estiver expirada que só redireciona antes de estar logado. Após fazer o login a página não muda. Apenas perde o menu que é criado dinamicamente.
Eis os códigos da aplicação.
o web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/login.xhtml</welcome-file>
</welcome-file-list>
</web-app>
O faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<!-- =========== FULL CONFIGURATION FILE ================================== -->
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<application>
<action-listener>br.com.scfweb.listener.DefaultActionListener</action-listener>
</application>
<lifecycle>
<phase-listener>br.com.scfweb.listener.DefaultPhaseListener</phase-listener>
</lifecycle>
<navigation-rule>
<navigation-case>
<from-outcome>erro</from-outcome>
<to-view-id>/views/comum/erroGeral.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
A classe implementando o PhaseListener
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.scfweb.listener;
import br.com.scfweb.utils.FacesUtil;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
public class DefaultPhaseListener implements PhaseListener {
private static final long serialVersionUID = -1065005858605121693L;
private static final String viewSessaoExpirada = "/faces/views/comum/erroSessaoExpirada.xhtml";
@Override
public void afterPhase(PhaseEvent event) {
FacesContext context = event.getFacesContext();
ExternalContext ext = context.getExternalContext();
HttpSession session = (HttpSession) ext.getSession(false);
boolean newSession = (session == null) || (session.isNew());
boolean postback = !ext.getRequestParameterMap().isEmpty(); // Depois de logado, este objeto sempre vem false (era pra vir true)
boolean timedout = postback && newSession;
if (timedout) {
FacesUtil.redirectTo(context.getExternalContext().getRequestContextPath() + viewSessaoExpirada);
}
}
@Override
public void beforePhase(PhaseEvent event) {
//OLD
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
Então, como mostrado na classe DefaultPhaseListener, o objeto postback não recebe o valor que deveria (true).
Não estou entendendo o porque e consequentemente não consegui resolver ainda.
Agradeço a quem puder ajudar.