3

我遇到了 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 请求的)

我在 WebLogic 12c 上运行 MyFaces 2.1.10、Primefaces 3.5、Primefaces Extension 0.6.3 和 Omnifaces 1.4.1

任何人都可以帮助我朝着正确的方向前进吗?如何让 FullAjaxExeptionHandler 正常工作?

谢谢

4

1 回答 1

3

对原始 facelet 页面的 POST 响应代码为 302

这个不对。JSF ajax 请求上的重定向必须具有 200 的响应代码和一个特殊的 XML 响应,其属性中包含一个<redirect>带有目标 URL 的元素。url

因此,这表明您HttpServletResponse#sendRedirect()在 JSF 有机会处理ViewExpiredException.

也许您在某个地方有一个 servlet 过滤器,它检查某些会话属性并根据其存在/状态发送重定向?然后应该根据以下答案操作该过滤器:JSF Filter not redirecting After Initial Redirect以识别 JSF ajax 请求并返回特殊的 XML 响应而不是 302 响应。

例如

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 没有任何机会抛出 a ViewExpiredException,因为您自己已经提前发送了重定向。

于 2013-04-16T12:06:29.250 回答