Запрос GET для перенаправления, инициированный браузером, но не успешный

При попытке перенаправить пользователя на URL-адрес он работает с запросами GET, но не с запросами обратной передачи.

В окне Network Firebug я вижу ответ на перенаправление, полученный браузером после завершения запроса обратной передачи (который должен вызвать перенаправление). Браузер, похоже, инициирует запрос GET для URL-адреса переадресации, но фактически не перенаправляет его. Он остается на той же странице.

Я использую сервер 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

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

Таким образом, вы пытаетесь отправить перенаправление по запросу ajax JSF с помощью "plain vanilla" Servlet API HttpServletResponse#sendRedirect(). Это неправильно. XMLHttpRequest не обрабатывает ответ 302 как новый window.location, а также как новый запрос ajax. Однако по мере того, как вы возвращаете полную HTML-страницу ваниль в качестве ответа ajax вместо предопределенного документа XML с инструкциями, которые детали HTML обновляют, механизм ajax JSF не имеет никакого представления о том, что делать с ответом перенаправленного запроса ajax. В итоге вы столкнулись с ошибкой JS (разве вы не видели ее в консоли JS?) И без визуальной обратной связи, если у вас нет обработчика jsf.ajax.onError().

Чтобы указать JAF ajax engine на изменение window.location, вам нужно вернуть специальный XML-ответ. Если вы использовали ExternalContext#redirect(), то это произошло бы полностью прозрачно.

externalContext.redirect(redirectURL);

Однако, если вы не находитесь в контексте JSF, например. в фильтре сервлетов или так, и, следовательно, у него нет 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);

См. также: