Java 会话过期后,Spring引导安全性不会重定向

Java 会话过期后,Spring引导安全性不会重定向,java,spring,spring-boot,extjs,spring-security,Java,Spring,Spring Boot,Extjs,Spring Security,我一直在使用SpringBoot,SpringSecurity和ExtJS作为前端。我添加了这段代码作为spring security的配置。这意味着,当会话到期时,用户将被重定向到引用的url,对吗 @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and() .authorizeRequests().antMatchers("/", "/lo

我一直在使用SpringBoot,SpringSecurity和ExtJS作为前端。我添加了这段代码作为spring security的配置。这意味着,当会话到期时,用户将被重定向到引用的url,对吗

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and()
            .authorizeRequests().antMatchers("/", "/login/**").permitAll().and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/userAuth")
            .permitAll()
            .and()
            .logout()
            .permitAll()
            .and()
            .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/**").permitAll();

            http.csrf().disable();
            http.headers().frameOptions().disable();

            http.sessionManagement().maximumSessions(1).expiredUrl("/login?logout");
}
每次我的前端向spring发送一个ajax请求,并且用户丢失了会话,spring都会像预期的那样将该请求转换为get request to/login?logout,但页面不会被重定向。我所能看到的只是请求响应内容上的登录页面,对用户看到的页面没有任何影响

为什么会发生这种情况?我是否缺少任何配置或实现

编辑:下面是我的Ext Js用于AJAX请求的样子:

onAuthCheck: function (users) {

    var result = Ext.Ajax.request({
        url: '/Queue/requests/loginCheck',
        method: 'POST',
        async: false,
        params: {
            usersInfo: Ext.encode(users)
        },
        success: function (conn, response, options, eOpts) {
            console.log(response)
            console.log(conn.status);
            if (conn.status === 401 || conn.status === 302) {
                location.href='/login?logout';
           }
        },
        failure: function (conn, response, options, eOpts) {
            console.log(response)
            console.log(conn.status)
            if (conn.status === 401 || conn.status === 302) {
                location.href='/login?logout';
           }
        }
    })
    return (Ext.JSON.decode(result.responseText, true).success);
},
EDIT2:我的请求看起来是这样的:它有一个状态为302的请求,我在JS代码上的AJAX响应中仍然得到200个状态

简短而简单的回答: 因为您是通过AJAX提交请求的,所以响应不会“影响”当前加载的页面

更准确地说: 如果在响应头中找到HTTP重定向代码(301、302、303),大多数浏览器(据我所知)仅重定向(与位置头有关)。因此,从技术上讲,如果spring将发送302HTTP状态码和身份验证url,浏览器将切换位置

据我所知,Spring发送了一个302如果它是一个GET请求

一个简单的解决方案: 这是Javascript和JQuery的一种方法: 检查ajax响应的结果。 (这只是一个例子,给你一个方向,会有更多的解决方案

    $.ajax({
        type: 'POST',
        url: '/url',
        success: function (result, status) {
            if (result.status === 401) {
                 location.href='/login?logout';
            }
        }
    });

您可以编写此函数,它将在每次调用ajax请求时触发

$(document).ajaxComplete(function(result, status) {
    if(status.status == 401){
        location.href = "/login?logout";
    }
});

使用AJAX时,这是正确的行为。我猜您在AJAX响应中看到的是重定向页面(loginpage)。您可能得到的会话无效,而不是过期。请尝试使用.invalidSessionUrl()(甚至也可以)@Kieveli我会试试的,谢谢。但我认为这是AJAX请求的问题。可能重复的可能重复不起作用…目前我在每个请求上都会收到AJAX请求的HTTP 200响应(即使是那些由于会话过期而无法通过的请求)。当我检查响应状态no network(无网络)选项卡时,它显示302,但JS为每个请求捕获200。嗯,我真的不知道那里发生了什么。尝试使用另一个ajax框架,我从未使用过extJS。我知道已经很晚了,但仍然…你得到了200个响应,因为第一个302响应将有一个重定向url,返回200。我也面临这个问题,用