首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JSF phaselistener重定向失败

从JSF phaselistener重定向失败
EN

Stack Overflow用户
提问于 2011-12-20 16:38:30
回答 2查看 6.2K关注 0票数 0

我的问题与here类似,但与PrimeFaces没有任何关系。另外,我也找不到一个真正的解决方案。

我基本上是在尝试让phaselistener重定向到登录页面,以防没有JSF会话(例如,当会话超时时)。

我正在尝试从JSF2 Phaselistener中进行重定向。总而言之,我正在做的是:

代码语言:javascript
复制
public void beforePhase(PhaseEvent event) {
    PhaseId id = event.getPhaseId();
    if(id.equals(PhaseId.RESTORE_VIEW)){
        FacesContext context = event.getFacesContext();
        Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
        if(sessionMap==null || sessionMap.isEmpty()){
            // No Session, Redirect to login
            try {
                context.getExternalContext().redirect("/login");
            } catch (Exception e) {
                ...
            }
        }
    }
}

当重定向代码运行时,我得到了这个异常:

代码语言:javascript
复制
java.lang.NullPointerException
        at org.apache.myfaces.context.servlet.PartialViewContextImpl.getPartialResponseWriter(PartialViewContextImpl.java:301)
        at org.apache.myfaces.context.servlet.ServletExternalContextImpl.redirect(ServletExternalContextImpl.java:452)
        at com.AuthenticationPhaseListener.userIsNotLogedIn

这可能是什么原因造成的?我做错了吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-20 19:28:03

这似乎是在ajax请求期间发生的。我不确定确切的原因,堆栈跟踪至少表明MyFaces实现中可能存在错误。

至少,总体设计方法很差。这种类型的超文本传输协议请求/响应修改最好不发生在PhaseListener中。在那里,它并不是为了。你想在一个普通的servlet Filter中做这类工作。

票数 3
EN

Stack Overflow用户

发布于 2012-03-13 23:47:16

嗯,我和你有同样的问题,但我没有像你那样用doing.My steps这样复杂的方法解决问题

代码语言:javascript
复制
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()应该如下所示:

代码语言:javascript
复制
/**
   * 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;
  }

由于我处理的是来自Oracle CMSDK的LibrarySessions,这就是为什么我的会话测试是这样的。最重要的是以某种方式检查您的会话,并根据会话是否存在给出真或假。

3)在faces-config.xml中配置监听器

代码语言:javascript
复制
<!-- Phase-Listener to check if user is logged in or not -->
<lifecycle>
    <phase-listener>com.mycompany.mypackagename.webapp.LoggedInCheck</phase-listener>
</lifecycle>

4)最后为"gotologin“定义导航规则

代码语言:javascript
复制
<!-- 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>

就是这样,只要您在任何页面上都没有会话,并且不在登录页面上,您就会被带到登录页面。

尽情享受

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8572700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档