我遇到Omnifaces FullAjaxExceptionHandler(http://showcase.omnifaces.org/exceptionhandlers/FullAjaxExceptionHandler)的问题。会话失效后,它不会重定向到指定的错误页面。
我在faces-config中有以下内容:
<factory>
<exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
以下在我的web.xml中:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/pages/error/viewExpired.html</location>
</error-page>
在我使会话无效后,从用户的角度来看似乎没有发生任何事情。该应用程序只是“死了”。在我的控制台中,我看到以下Ajax请求:
我正在运行MyFaces 2.1.10,Primefaces 3.5,Primefaces Extension 0.6.3&amp; WebLogic 12c上的Omnifaces 1.4.1
有人能帮助我朝正确的方向发展吗?如何让FullAjaxExeptionHandler正常工作?
由于
答案 0 :(得分:3)
对原始facelet页面的POST,响应代码为302
这是不对的。 JSF ajax请求的重定向必须具有200的响应代码,其中包含<redirect>
元素的特殊XML响应,其url
属性中包含目标URL。
这表明您在JSF有机会处理HttpServletResponse#sendRedirect()
之前很久就手动使用了ViewExpiredException
。
也许你在某个地方有一个servlet过滤器,它会检查一些会话属性并根据其存在/状态发送重定向?然后应根据以下答案操作该过滤器:JSF Filter not redirecting After Initial Redirect以识别JSF ajax请求并返回特殊的XML响应而不是302响应。
E.g。
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>", loginURL);
} else {
response.sendRedirect(loginURL);
}
这一切与FullAjaxExceptionHandler
完全无关。 JSF没有任何机会抛出ViewExpiredException
因为你事先已经发送了重定向。