4

在尝试将用户重定向到 URL 时,它适用于 GET 请求,但不适用于回发请求。

通过萤火虫的网络窗口,我可以看到回发请求(应该会导致重定向)完成后浏览器收到的重定向响应。浏览器看似对重定向 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
4

1 回答 1

6
X-Requested-With: XMLHttpRequest
Faces-Request: partial/ajax

因此,您正尝试使用“plain vanilla”Servlet API 对 JSF ajax 请求发送重定向HttpServletResponse#sendRedirect()。这个不对。XMLHttpRequest不会将 302 响应视为新的,window.location而只是将其视为新的 ajax 请求。但是,当您返回一个完整的普通 HTML 页面作为 ajax 响应而不是带有要更新哪些 HTML 部分的说明的预定义 XML 文档时,JSF ajax 引擎不知道如何处理重定向的 ajax 请求的响应。如果您没有jsf.ajax.onError()配置处理程序,您最终会遇到 JS 错误(您没有在 JS 控制台中看到它吗?)并且没有任何形式的视觉反馈。

为了指示 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);

也可以看看:

于 2013-05-22T18:57:42.400 回答