【问题标题】:No ajax action fired after session invalidate会话无效后没有触发 ajax 操作
【发布时间】:2014-12-18 13:49:15
【问题描述】:

我们有一个带有 Primefaces 4.0 和 CAS 单点登录的 JSF webapp。

当用户在失去会话后请求 ajax 操作(通过单击 p:commandButton 或具有 ajax=true 的类似组件)时,因为 SSOut 在另一个选项卡中,没有任何反应,服务器或操作不会触发任何响应。 我们需要管理这种情况,通过显示对话框或将他重定向到主页或自定义页面来通知用户他的会话不再可用,但我们不知道如何。

ajax=false 解决了问题,但这不是我们想要做的。

没有抛出 ViewExpiredException。

编辑: 我们已经阅读并尝试了this BalusC's solution,但没有成功。不抛出异常,与 Handler 无关。请注意,这不是 Expired Session 或 Invalidated by TimeOut session,只是一个显式 session.invalidate 由 Cas Sign Out 在另一个选项卡中引起。

我们还尝试了 javascript jsf.ajax.addOnError() 解决方案,但再次没有捕获任何内容。 只有 p:ajaxStatus onError 事件会捕获某些内容,但无法识别该特定错误。即使覆盖 ajaxStatus javascript 函数,错误数据参数也未定义... 此外,p:log 表示“请求返回错误:错误”。但是,这是哪个错误?我们如何识别它? 我们被困在这个问题上......

【问题讨论】:

    标签: ajax jsf session primefaces cas


    【解决方案1】:

    这已经讨论过很多次了,据了解还没有任何开箱即用的解决方案。一种解决方案是添加自定义ExceptionHandler,如this post 中所述。

    另一种选择是使用jsf.ajax.addOnError(...) 注册客户端错误处理程序,并在其中处理此异常。如果会话无效,您可能需要一些服务器代码来添加自定义标头,您可以在错误处理程序中使用它来区分该特定情况与其他错误。

    【讨论】:

    • 嗨@Predrag,感谢您的回复。我们已经阅读并尝试了 BalusC 解决方案,但没有成功。
    • 我明白,您可以尝试的一件事是拥有一个 servlet 过滤器,每个请求都将通过它(甚至可能只是 ajax,但不需要让它变得复杂)。在此过滤器中,您可以添加一些自定义标头,其值将取决于会话有效性(您可以在服务器端检查)。像session-valid: true/false 这样的东西。这样,addOnError 处理程序将能够识别此特定状态。
    猜你喜欢
    • 2023-03-14
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2016-03-14
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多