【问题标题】:FullAjaxExceptionHandler does not redirect to error page after invalidated sessionFullAjaxExceptionHandler 在会话无效后不会重定向到错误页面
【发布时间】:2013-04-08 11:55:10
【问题描述】:

我遇到了 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 正常工作?

谢谢

【问题讨论】:

    标签: jsf jsf-2 primefaces weblogic12c omnifaces


    【解决方案1】:

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

    这是不对的。 JSF ajax 请求的重定向必须有一个响应代码为 200 的特殊 XML 响应,该响应带有一个 &lt;redirect&gt; 元素,其 url 属性中带有目标 URL。

    因此,这表明您在 JSF 有机会处理 ViewExpiredException 之前很久就手动使用了 HttpServletResponse#sendRedirect()

    也许您在某个地方有一个 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 没有机会抛出 ViewExpiredException,因为您自己已经提前发送了重定向。

    【讨论】:

    • 感谢您的回答。我确定我没有手动发送重定向...这可能是 weblogic 特定的问题吗?是否可以使用您的实现代码编写我自己的过滤器来解决这个问题?
    • 是的,如果您使用的是容器管理的身份验证,那将很可能发生。然而,我对 Weblogic 不够熟悉,无法提出正确的解决方案; OmniFaces 在OmniPartialViewContext 中有一个内置解决方案,它应该涵盖这种特定情况,但是仅在执行转发(如Tomcat、JBoss 和Glassfish 所做的)而不是重定向时才有效。作为第一步,探索所有请求属性,看看 WebLogic 是否没有设置某些特定的请求属性来指示容器管理的身份验证已启动。
    • 另请参阅此相关问题:stackoverflow.com/questions/12504131/…
    • 是的,我们正在使用容器管理的身份验证。这是否意味着我不能使用 FullAjaxExceptionHandler?您能否在不使用您的 FullAjaxExceptionHandler 的情况下为我指明一个方向以使其正常工作?提前谢谢!
    • @Dan:您发送的是 HTTP 重定向而不是呈现视图。这不符合标准 servlet 规范,并且不适用于 /WEB-INF 中的错误页面。
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多