会话过期后,Spring Boot安全性不会重定向

时间:2019-05-15 14:21:00

标签: java spring spring-boot extjs spring-security

我一直在使用弹簧靴,将弹簧安全性和Ext Js用作前端。我添加了这段代码作为Spring安全性的配置。这意味着,当会话过期时,用户将被重定向到引用的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将请求转换为/ login?logout的get请求,但是页面没有被重定向。我所能看到的只是请求响应内容上的登录页面,而对用户所看到的页面没有任何影响。

为什么会这样?我在这里缺少任何配置或实现吗?

编辑:这是我对AJAX请求的Ext Js的样子:

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状态。

enter image description here

2 个答案:

答案 0 :(得分:1)

简短答案:

因为您正在通过AJAX提交请求,所以响应不会“影响”您当前加载的页面。

更准确地说:

如果在响应标头中找到HTTP重定向代码(301、302、303),则大多数浏览器(我所知道的)仅重定向(尊重位置标头)。因此从技术上讲,如果spring将发送302 http状态代码以及身份验证网址,则浏览器将切换位置。

据我所知,Spring发送了一个302 IF ,它是一个 GET-Request

一个简单的解决方案:

这是使用Javascript和JQuery的一种方法: 检查ajax响应的结果。 (这只是一个示例,为您提供指导,将会有更多解决方案。

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

答案 1 :(得分:0)

你可以写这个函数,它会在每次调用ajax请求时被触发。

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