jsf 2 response.sendRedirect不起作用

时间:2012-06-08 18:37:38

标签: jsf-2 richfaces

我在JSF2.1 / Richfaces 4.2应用程序中观察到一件有趣的事情。在Filter(或)JSF Bean操作方法中的所有response.sendRedirect()调用都不起作用。

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

有关可能导致重定向失败的原因的任何建议?我试过以下签名。

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

2 个答案:

答案 0 :(得分:7)

  

在Filter(或)JSF Bean操作方法中的所有response.sendRedirect()调用都不起作用。

如果请求实际上是ajax请求,则会发生这种情况。 Web浏览器根本不会将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);

另见:

答案 1 :(得分:0)

FacesContext.getCurrentInstance().getExternalContext().redirect(url);