Запрос 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);
См. также: