1

我有一个 JSF Phase Listerner 检查用户是否登录,如果没有,将他们重定向到登录页面。这适用于非 ajax 请求。但是,如果用户在一个页面上,在我的例子中,这个页面有一个 primefaces 数据表,并单击一个调用 ajax 请求的按钮——但他们的会话已超时——代码被执行以发出重定向(使用ExternalContext#redirect),但不会将用户导航到登录页面。

知道为什么这不起作用吗?

这是我的相位监听器:

private static final String IS_LOGGED_IN_INDICATOR = "loggedIn";
private static final String LOGIN_PAGE = "/login.jsp";

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

public void beforePhase(PhaseEvent event) {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    HttpSession session = (HttpSession)ec.getSession(false);

    if (session==null || session.getAttribute(IS_LOGGED_IN_INDICATOR) == null) {
       try {
            ec.redirect(LOGIN_PAGE);
       }
       catch(IOException e) {
           // log exception...
       }            
    }
}

public void afterPhase(PhaseEvent event) {
    // no-op
}   

}

4

2 回答 2

3

它失败了,因为 ajax 上下文试图从视图根中获取渲染工具包,而根本没有视图根。那时还没有恢复。这导致了一个NullPointerExceptionin PartialViewContext#createPartialResponseWriter()。反过来,这个异常不会被抛出,而是被放入一个应该由 custom 处理的 ajax 异常队列中ExceptionHandler。你显然没有任何人。如果您创建/使用这样的异常,则此异常是可见的FullAjaxExceptionHandler(有关更多详细信息,另请参阅此博客)。

afterPhase()要解决特定问题,请改为执行该工作。然后完全恢复视图根,并且 ajax 上下文可以从中获取渲染工具包,以便编写专门的 XML 响应,指示 JavaScript 中的 JSF ajax 引擎更改窗口位置。如果没有 ajax,则不需要渲染工具包,因为重定向基本上只是设置响应标头的问题。

具体NullPointerException是否反过来是 Mojarra 中的错误是一个不同的问题,可以更好地在他们自己的问题跟踪器上以问题报告的形式发布。

于 2012-06-22T04:22:23.863 回答
-1

这是因为您必须在 XML 中为 Ajax 请求发送一个特殊响应才能进行重定向(检查这个答案),我已经在这样的过滤器中实现了这个..

// Check if it's an Ajax Request 
if ("partial/ajax".equals(((HttpServletRequest) request).getHeader("Faces-Request"))) {
      //redirect 
      response.setContentType("text/xml");
      response.getWriter()
           .append("<?xml version=  \"1.0\" encoding=\"UTF-8\"?>")
           .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>",url);

你应该把它移植到你的 Phase Listener。

于 2012-06-21T19:09:26.483 回答