尝试将用户重定向到URL时,它适用于GET请求,但不适用于回发请求。
通过firebug的“网络”窗口,我可以看到回发请求(应引起重定向)完成后浏览器收到的重定向响应。浏览器似乎启动了对重定向URL的GET请求,但实际上并未成功重定向。它保留在同一页面上。
我在JSF服务器端使用。服务器根本没有收到启动的GET请求。但是由浏览器根据服务器的要求启动。我猜问题只是在客户端
谁能解释如何使重定向成功完成?如果需要提供更多信息,请告诉我。
请求重定向标头:
GET /Px10Application/welcome.xhtml HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20100101 Firefox/20.0 Accept: application/xml, text/xml, */*; q=0.01 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate DNT: 1 Referer: http://localhost:8080/Px10Application/channelPages.xhtml?channelId=-3412&type=Group X-Requested-With: XMLHttpRequest Faces-Request: partial/ajax Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Cookie: hb8=wq::db6a8873-f1dc-4dcc-a784-4514ee9ef83b; JSESSIONID=d40337b14ad665f4ec02f102bb41; oam.Flash.RENDERMAP.TOKEN=-1258fu7hp9 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache
重定向响应头:
HTTP/1.1 200 OK X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1 Java/Sun Microsystems Inc./1.6) Server: GlassFish Server Open Source Edition 3.1 Set-Cookie: oam.Flash.RENDERMAP.TOKEN=-1258fu7hp8; Path=/Px10Application Pragma: no-cache Cache-Control: no-cache Expires: -1 Content-Type: text/xml;charset=UTF-8 Content-Length: 262 Date: Wed, 22 May 2013 17:18:56 GMT
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()配置处理程序,则没有任何形式的视觉反馈。
HttpServletResponse#sendRedirect()
XMLHttpRequest
window.location
jsf.ajax.onError()
为了指示JSF ajax引擎更改window.location,您需要返回一个特殊的XML响应。如果您ExternalContext#redirect()改为使用它,那么它将完全透明地进行。
ExternalContext#redirect()
externalContext.redirect(redirectURL);
但是,如果您不在JSF上下文中(例如,在servlet过滤器中),因此手边没有FacesContext,那么您应该手动创建并返回特殊的XML响应。
FacesContext
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()
Servlets.facesRedirect(request, response, redirectURL);