X-Requested-With: XMLHttpRequest
Faces-Request: partial/ajax
因此,您正在尝试使用“普通香草” Servlet API的JSF
ajax请求发送重定向
HttpServletResponse#sendRedirect()。这是不对的。该
XMLHttpRequest不会把302响应作为一个新的
window.location,但只是作为一个新的Ajax请求。但是,当您返回一个完整的普通HTML页面作为ajax响应,而不是一个预定义的XML文档(其中包含要更新HTML部分的说明)时,JSF
ajax引擎不知道如何处理重定向的ajax请求的响应。您最终会遇到JS错误(您是否在JS控制台中看到了它?),如果未
jsf.ajax.onError()配置处理程序,则没有任何形式的视觉反馈。
为了指示JSF
ajax引擎更改
window.location,您需要返回一个特殊的XML响应。如果您
ExternalContext#redirect()改为使用它,那么它将完全透明地进行。
externalContext.redirect(redirectURL);
但是,如果您不在JSF上下文中(例如,在servlet过滤器中),因此手边没有
FacesContext,那么您应该手动创建并返回特殊的XML响应。
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { response.setContentType("text/xml"); response.getWriter() .append("<?xml version="1.0" encoding="UTF-8"?>") .printf("<partial-response><redirect url="%s"></redirect></partial-response>", redirectURL);} else { response.sendRedirect(redirectURL);}如果您碰巧使用了JSF实用程序库OmniFaces,那么您也可以使用
Servlets#facesRedirect()它:
Servlets.facesRedirect(request, response, redirectURL);



