4

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

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

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

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

4

1 回答 1

12

这是 Spring Security 将重定向发送回客户端的默认方式的问题。向客户端发送重定向的默认方法是发送 302 临时移动响应的 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

于 2013-06-04T08:35:16.150 回答