-1

我有以下 JSF 支持 bean 方法,它应该根据某些条件执行重定向。

public void navigationStatus() throws IOException {
    log(LogMessages.getLogString(user, currentDatasource, nomeClasse, "navigationStatus", "navigationStatus"), null);
    logger.debug("INSIDE  navigationStatus ");
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

    if (!isUserEnabled()) {
        log(LogMessages.getLogString(user, currentDatasource, nomeClasse, "navigationStatus", "Sessione utente SCADUTA"), null);
        logger.debug("Sessione utente SCADUTA");
        response.sendRedirect("error.jsp");         
    }
}

然而,这并不适用于所有页面。它适用于某些页面,但不适用于其他页面。这是如何引起的,我该如何解决?

4

1 回答 1

0

在以下情况下肯定会失败:

  1. 传入的 HTTP 请求是一个 ajax 请求。
  2. HTTP 响应已经提交。

要解决/避免它们,您需要:

  1. 使用标准的 JSF API 方法来发送重定向,而不是从 JSF 的引擎盖下拖拉原始 Servlet API,而后者又对它运行的 JSF 上下文一无所知。

    context.getExternalContext().redirect("error.jsp");
    

    那么传入的 HTTP 请求是一个 ajax 请求,那么上述方法将透明地返回正确的 XML 响应,正如 JSF ajax 引擎所期望的那样。

    将来,当您需要从javax.servlet.*JSF 支持 bean 中的包中导入某些内容时,您应该立即停止编码并问自己是否真的没有标准的 JSF 方式来完成您的工作。

  2. 在渲染响应阶段之前执行作业。如果您在例如构造函数或@PostConstruct请求/视图范围的支持 bean 中执行此操作,该 bean 第一次在页面“中途”被引用,那么发送重定向可能为时已晚,因为第一部分HTTP 响应已经发送到客户端。这是一个不归路,您只会IllegalStateException在服务器日志中找到所有位置。

    如果确实如此,那么您需要通过<f:event>监听来调用作业preRenderView

    <f:event type="preRenderView" listener="#{bean.navigationStatus}" />
    
于 2013-03-26T13:45:38.367 回答