我创建了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 的顺序正确处理请求管道?
答案 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)
...
...
}