尝试将用户重定向到网址时,它可以使用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
答案 0 :(得分:6)
X-Requested-With: XMLHttpRequest
Faces-Request: partial/ajax
因此,您尝试使用“普通的vanilla”Servlet API HttpServletResponse#sendRedirect()
发送JSF ajax请求的重定向。这个不对。 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);