【问题标题】:jsf 2 response.sendRedirect is not workingjsf 2 response.sendRedirect 不工作
【发布时间】:2012-06-12 20:03:55
【问题描述】:

我在我的 JSF2.1/Richfaces 4.2 应用程序中观察到一件有趣的事情。过滤器(或)JSF Bean 操作方法中的所有 response.sendRedirect() 调用都无法正常工作。

如果我们在客户端(浏览器)使用 location.href,它工作正常。

关于可能导致发送重定向失败的任何建议?我试过下面的签名。

response.sendRedirect("/appRoot/mypage.xhtml");
  or 
(HttpServletResponse) facesCtx.getResponse()).sendRedirect(((HttpServletRequest)request).getContextPath()+"/appRoot/mypage.faces");

【问题讨论】:

    标签: jsf-2 richfaces


    【解决方案1】:

    过滤器(或)JSF Bean 操作方法中的所有 response.sendRedirect() 调用如何不起作用。

    如果请求实际上是一个 ajax 请求,就会发生这种情况。网络浏览器根本不会将XMLHttpRequest 上的重定向转换到主窗口。发送 ajax 请求的 JS 代码对此负责。它需要一个特殊/不同的响应,以便 JS 代码了解它需要更改窗口位置,或者需要更改 JS 代码本身以便它可以相应地处理响应。

    如果 ajax 请求是由 JSF 本身发起的(例如 <f:ajax> 等)并且 Java 代码在 JSF 上下文中运行,那么您应该使用 ExternalContext#redirect() 代替。这会自动检测当前请求是否为 ajax 请求,并将返回一个特殊的 XML 响应,告诉 JSF ajax 引擎更改窗口的位置。如果您不在 JSF 上下文中(例如,在 Filter 中),那么您需要自己创建这个特殊的 XML 响应,如下所示:

    response.setContentType("text/xml");
    response.getWriter()
        .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
        .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url);
    

    另见:

    【讨论】:

    • 嗨 BalusC,是的,所有这些都是 a4j:command 调用。 +1,这个理论完全有道理。如果我们需要在非 JSF 上下文(Servlet 过滤器)中进行重定向,有什么办法(比如 JSF 的 ExternalContext#redirect())?
    • 您需要自己编写特殊的 XML 响应。有关示例,请参见链接的问题。我刚刚将它复制到上面的答案中。
    • 知道了。有道理。让我试试。谢谢!
    • 我必须补充一点,答案绝对适用于标准 JSF ajax JS API(即当使用&lt;f:ajax&gt; 时)。它也适用于 PrimeFaces,但我不能告诉 RichFaces。如果失败,您需要在某些&lt;a4j:xxx&gt; 组件触发ExternalContext#redirect() 时调试HTTP 响应,然后改用该XML 语法。
    • 它似乎有效(至少对于 a4j:command 调用)。我正在测试更多。
    【解决方案2】:
    FacesContext.getCurrentInstance().getExternalContext().redirect(url);
    

    【讨论】:

    • 您能解释一下为什么这样有效并与已包含您的代码的已接受答案相比增加价值吗?
    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多