GET请求重定向由浏览器启动但不成功

时间:2013-05-22 17:10:22

标签: html ajax jsf redirect get

尝试将用户重定向到网址时,它可以使用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

1 个答案:

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

另见: