Probably You can achieve this with phase listeners. For example:
public class MyPhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
System.out.println("afterPhase with ID : " + event.getPhaseId());
}
@Override
public void beforePhase(PhaseEvent event) {
// Do not exceute subsequent phases if sending a redirect
event.getFacesContext().responseComplete();
try {
((HttpServletResponse)event.getFacesContext().getExternalContext().getResponse()).sendRedirect("http://stackoverflow.com");
} catch (IOException ex) {
Logger.getLogger(MyPhaseListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
Register the listener in faces-config.xml
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<lifecycle>
<phase-listener>MyPhaseListener</phase-listener>
</lifecycle>
</faces-config>