我在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");
Run Code Online (Sandbox Code Playgroud)
在Filter(或)JSF Bean操作方法中的所有response.sendRedirect()调用都不起作用.
如果请求实际上是ajax请求,则会发生这种情况.webbrowser根本不会将重定向转换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);
Run Code Online (Sandbox Code Playgroud)