3

我在我的 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");
4

2 回答 2

7

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

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

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

也可以看看:

于 2012-06-08T18:41:15.790 回答
0
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
于 2014-03-10T16:31:19.277 回答