Single-Sign-On и Spring - бины инициируются после первого жизненного цикла JSF, например, страницы индекса - PullRequest
0 голосов
/ 23 марта 2011

Чтобы прояснить ситуацию: Мы используем единый вход, поэтому страница входа больше не требуется, и имя пользователя / роль уже доступны. Теперь пользователь с ролью beer хочет получить доступ к странице beer, а пользователь с ролью loudFart хочет получить доступ к странице loudFart - при первом входе в приложение

public class DebugPhaseListener implements PhaseListener {

    public void beforePhase(PhaseEvent event) {

        String path=FacesContext.getCurrentInstance().getExternalContext().getRequestServletPath();
        if("/index.jsf".equals(path)) {
            FacesContext fc = FacesContext.getCurrentInstance();
            String toOutcome =  (UserSession) context.getExternalContext().getSessionMap().get("userSession").getWelcomePage(); 

            System.out.println("redirecting "+ toOutcome);
            fc.getApplication().getNavigationHandler().handleNavigation(fc, null,toOutcome);
        }

    }

    public void afterPhase(PhaseEvent event) {

    }

    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
}

Печальная реальность такова, что весна не запускает никаких бобов для страницы приветствия

19:19:59,828 INFO  [STDOUT] RESTORE_VIEW 1 <--- before phase //this is true even for render response phase
19:19:59,830 WARN  [lifecycle] phase(RESTORE_VIEW 1,com.sun.faces.context.FacesContextImpl@197cf78) threw exception: java.lang.NullPointerException null
jp.funny.something.util.DebugPhaseListener.beforePhase(DebugPhaseListener.java:25)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:222)

После первого вызова с нулевым указателем, пользовательская сессия существует, и она снова работает :-), но это все еще отстой

Между прочим, это находится на JBoss 4.2.2, и я попробовал оба метода org.springframework.web.context.ContextLoaderListener и org.springframework.web.context.ContextLoaderServlet

Есть ли другой способ сделать это? Различные конфигурации, чтобы попробовать? Спасибо, ребята

1 Ответ

0 голосов
/ 30 марта 2011

Это намного проще, чем я думал: (просто убедитесь, что в конструкторе бина, который вы пытаетесь получить, нет нулевого указателя ;-))

public class SomeListener implements PhaseListener{ public void beforePhase(PhaseEvent event) { 
        FacesContext fc = FacesContext.getCurrentInstance();
        String path=fc.getExternalContext().getRequestServletPath();
        if(LOGIN_PATH.equals(path)) {
            if(logger.isDebugEnabled())
                logger.debug("Redirecting away from " + LOGIN_PATH+ " page");
            FacesContext ctx = FacesContext.getCurrentInstance();
            UserSession u= UserSession.getInstance(ctx);
            if(u==null) {
                WebApplicationContext wac = FacesContextUtils.getWebApplicationContext(fc);
                u =(MyUserSession)wac.getBean("myUserSession");
            }
            String toOutcome =  u.login();
            if(logger.isDebugEnabled())
                logger.debug("redirecting "+ toOutcome);
            fc.getApplication().getNavigationHandler().handleNavigation(fc, null,toOutcome);
        }
    }
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }}
...