Ну, у меня была такая же проблема, как и у вас, но я не решил ее так сложно, как вы. Мои шаги
1) create a class that implements the PhaseListener
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
/**
*
* @author fakumawah @date 09.03.2012
*/
public class LoggedInCheck extends BackingBean implements PhaseListener
{
@Override`enter code here`
public PhaseId getPhaseId()
{
return PhaseId.ANY_PHASE;
}
@Override
public void beforePhase(PhaseEvent event)
{
}
@Override
public void afterPhase(PhaseEvent event)
{
FacesContext fc = event.getFacesContext();
boolean loginPage = fc.getViewRoot().getViewId().lastIndexOf("login") > -1 ? true : false;
if (!loginPage && !loggedIn())
{
NavigationHandler nh = fc.getApplication().getNavigationHandler();
nh.handleNavigation(fc, null, "gotologin");
}
}
private boolean loggedIn()
{
return getSessionWrapper().isLoggedInAgain();
}
}
Извините за некомментированный код, но я думаю, что код действительно прост для понимания. Наиболее важная вещь, которую нужно отметить - это afterPhase (..), который проверяет, нахожусь ли я в системе, или у меня уже есть сеанс Если я этого не сделаю, он создаст навигатор и перейдет на страницу входа в систему
2) Ваш isLoggedInAgain () должен выглядеть примерно так:
/**
* A method to check if Username is already logged in
* @param username
* @return
*/
public boolean isLoggedInAgain()
{
if (session != null) // Check if session is not null
{
if (session.isConnected()) // Check if session is connected
{
return true;
//destroyIfsLibrarySession(); // Session is available -> destroy session
}
else // session is not available
{
logger.log(Level.SEVERE, "Already logged out");
return false;
}
}
return false;
}
Так как я имею дело с LibrarySessions из Oracle CMSDK, именно поэтому мой тест для сессии выглядит следующим образом. Наиболее важно как-то проверить ваш сеанс и выдать true или false, в зависимости от того, существует сеанс или нет.
3) Настройте прослушиватель в face-config.xml
<!-- Phase-Listener to check if user is logged in or not -->
<lifecycle>
<phase-listener>com.mycompany.mypackagename.webapp.LoggedInCheck</phase-listener>
</lifecycle>
4) Наконец, определите правило навигации для "gotologin"
<!-- Navigation Rule for sending user to login page from an expired session -->
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>gotologin</from-outcome>
<to-view-id>/login.em</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
И это все, когда у вас нет сеанса на какой-либо странице и вы не находитесь на странице входа, вы будете перенаправлены на страницу входа.
Наслаждайтесь