我在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");
答案 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);