GET запрос на перенаправление инициирован браузером, но не выполнен

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

Через окно сети 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 с помощью "простого ванильного" API сервлета HttpServletResponse#sendRedirect(), Это неправильно. XMLHttpRequest не обрабатывает 302 ответ как новый window.location, но так же, как новый запрос AJAX. Однако, поскольку вы возвращаете полную обычную HTML-страницу в виде ответа Ajax вместо предопределенного XML-документа с инструкциями, какие части HTML обновлять, движок JSF JJF не имеет никаких подсказок, что делать с ответом на перенаправленный запрос AJAX. Вы в конечном итоге с ошибкой JS (разве вы не видели ее в консоли JS?) И без визуальной обратной связи, если у вас нет jsf.ajax.onError() обработчик настроен.

Чтобы дать команду движку JSF ajax изменить 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);

Смотрите также:

Другие вопросы по тегам