在无效会话后,FullAjaxExceptionHandler不会重定向到错误页面

时间:2013-04-16 07:14:08

标签: jsf jsf-2 primefaces weblogic12c omnifaces

我遇到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请求:

  • 对原始facelet页面的POST,响应代码为302
  • 使用代码200获取登录页面(但没有任何反应,因为它是通过Ajax请求的)

我正在运行MyFaces 2.1.10,Primefaces 3.5,Primefaces Extension 0.6.3&amp; WebLogic 12c上的Omnifaces 1.4.1

有人能帮助我朝正确的方向发展吗?如何让FullAjaxExeptionHandler正常工作?

由于

1 个答案:

答案 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因为你事先已经发送了重定向。