Spring安全会话超时处理Ajax调用

时间:2014-07-14 06:48:13

标签: java ajax spring spring-security

我创建了webapp,我使用过Spring Security,并在 spring-security.xml 文件中添加了2个自定义过滤器,如下所示。

    <security:custom-filter ref="authenticationFilter" position="FORM_LOGIN_FILTER"/>
    <security:custom-filter ref="concurrencyFilter" position="CONCURRENT_SESSION_FILTER"/>

适用于非Ajax请求。当我尝试在会话已经过期时发送AJAX请求时,操作将返回登录页面作为html,其中响应被加载到div元素中。 我已经搜索了解决方案并找到了这个链接Session Timeout handling for Ajax calls,其中定义的功能返回状态代码,此代码用于javascript端,以便将用户导航到登录页面。

我的问题是:

必须在 spring-security.xml 文件中定义 authenticationFilter concurrencyFilter ajaxTimeoutRedirectFilter 的顺序正确处理请求管道?

1 个答案:

答案 0 :(得分:3)

查看 3)过滤器配置

  

我们的想法是在Spring Security过滤器链中添加上面的自定义过滤器。过滤器链中的顺序至关重要。我们的过滤器应该拦截Ajax调用之前的会话超时,以便在vanilla ExceptionTranslationFilter 之前发送自定义HTTP错误代码。

在xml config中添加:

<custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER"/>

在java config中添加:

@Bean
public Filter ajaxTimeOutRedirectFilter() {
    AjaxTimeOutRedirectFilter f = new AjaxTimeOutRedirectFilter();
    //f.setCustomSessionExpiredErrorCode(901);
    return f;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterAfter(ajaxTimeOutRedirectFilter(), ExceptionTranslationFilter.class)
        ...
        ...
}

这对我有用,感谢DuyHai's Java BlogDemo application for the article