通过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
解决方法
- X-Requested-With: XMLHttpRequest
- Faces-Request: partial/ajax
因此,您尝试使用“普通的vanilla”Servlet API的HttpServletResponse #sendRedirect()发送JSF ajax请求的重定向.这个不对. 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);
也可以看看:
> Authorization redirect on session expiration does not work on submitting a JSF form,page stays the same
> JSF Filter not redirecting After Initial Redirect