【问题标题】:Redirect handling PrimeFaces Ajax requests on session timeout in Spring Security在 Spring Security 中重定向处理会话超时的 PrimeFaces Ajax 请求
【发布时间】:2013-05-27 07:38:15
【问题描述】:

我正在尝试让 JSF Web 前端在会话超时时重定向回登录页面(在 Spring Security 中)。

我曾尝试使用元刷新方法,但是这会导致不良副作用,即当页面上仅使用 AJAX 控件时元刷新时间不会更新。这意味着页面可能会在您仍在使用时刷新,因为您还没有转换到另一个页面,而只是对服务器进行了 AJAX 调用。我还没有找到使用 Primefaces 轻松改变这种行为的方法。

当会话过期时,Spring Security 会向 Primefaces 发送 302 HTTP 错误消息,但是 Primefaces 只是忽略重定向请求。您可以判断会话何时过期,因为 Primefaces 控件由于 AJAX 调用不成功而停止响应。

我正在使用 Primefaces 3.4.2 和在 Glassfish 3.1.2.2 上运行的 Spring Security 3.1.4。

【问题讨论】:

    标签: ajax jsf-2 primefaces spring-security session-timeout


    【解决方案1】:

    这是 Spring Security 将重定向发送回客户端的默认方式的问题。向客户端发送重定向的默认方法是发送 302 Temporarily Moved 响应的 HTML 方法,但这不适用于 AJAX 客户端。 AJAX 客户端将此解释为重定向到新位置以发布/获取其数据,而不是页面重定向。让 AJAX 客户端以与普通 HTML 请求相同的方式将浏览器重定向到新页面的正确方法是:

    <?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <partial-response>
      <redirect url="http://your.url.here/"></redirect>
    </partial-response>
    

    要覆盖 Spring Security 使用的默认无效会话策略,您需要在 Spring 配置中创建一个 SessionManagementFilter bean,并传递一个实现 InvalidSessionStrategy 的类和当通过 HTML 或 AJAX 收到请求时发送正确的重定向响应:

    <bean id="sessionManagementFilter" class="org.springframework.security.web.session.SessionManagementFilter">
      <constructor-arg name="securityContextRepository" ref="httpSessionSecurityContextRepository" />
      <property name="invalidSessionStrategy">
        <bean class="yourpackage.JsfRedirectStrategy">
           <constructor-arg name="invalidSessionUrl" value="/your_session_expired_page.xhtml" />
        </bean>
      </property>
    </bean>
    <bean id="httpSessionSecurityContextRepository" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"/>
    

    然后您需要将此过滤器添加到您的 Spring Security HTTP 块中:

    <security:http use-expressions="true">
        <security:custom-filter ref="sessionManagementFilter" before="SESSION_MANAGEMENT_FILTER" />
        ...
    </security:http>
    

    现在将在您的应用程序启动时创建自定义会话管理过滤器,并且在找到过期会话时将执行提供的无效会话策略类。

    如何实现无效会话策略的一个很好的例子可以在这里找到:https://gist.github.com/banterCZ/5160269

    此处提供了使用 IceFaces 的类似问题:JSF 2, Spring Security 3.x and Richfaces 4 redirect to login page on session time out for ajax requests

    【讨论】:

    • 我(成功)实现您的答案的一个注释:不要清除您的 cookie,然后触发 ajax 请求作为测试此方法的一种方式!新的无会话请求不会像过期会话一样被视为“无效”!
    猜你喜欢
    • 2012-06-27
    • 2015-07-19
    • 2013-06-10
    • 2010-11-03
    • 2012-12-26
    • 2012-04-25
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多