小编典典

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

ajax

尝试将用户重定向到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

阅读 253

收藏
2020-07-26

共1个答案

小编典典

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);
2020-07-26