【问题标题】:Spring boot security does not redirect after session expires会话过期后 Spring Boot 安全性不会重定向
【发布时间】:2019-10-02 17:33:54
【问题描述】:

我一直在使用 spring boot,以 spring security 和 Ext Js 作为前端。我添加了这段代码作为弹簧安全的配置。这意味着,当会话到期时,用户将被重定向到引用的 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 状态。

【问题讨论】:

  • 这是您使用 AJAX 时的正确行为。我猜你在 Ajax 响应中看到了重定向页面(登录页面)。
  • 您可能会得到一个无效的会话而不是过期的。尝试 .invalidSessionUrl() 代替(甚至也可以)
  • @Kieveli 我会试试的,谢谢。但我认为这是 AJAX 请求。

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


【解决方案1】:

简短的回答:

由于您是通过 AJAX 提交请求,因此响应不会“影响”您当前加载的页面。

更准确地说:

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

据我所知,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';
            }
        }
    });

【讨论】:

  • 它不起作用...目前我在每个请求的 ajax 请求上都收到 HTTP 200 响应(即使是那些由于会话到期而不会通过的请求)。当我检查响应状态时,没有网络选项卡显示 302,但 JS 为每个请求捕获 200。
  • 嗯,我真的不知道那里发生了什么。尝试为 ajax 使用另一个框架,我从未使用过 extJS。
  • 我知道它迟到了,但仍然......你得到 200 响应,因为第一个 302 响应将有一个返回 200 的重定向 url。我也遇到了这个问题,使用 stackoverflow.com/questions/23901950/… 解决了它
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 2022-09-28
    • 2016-10-26
    • 1970-01-01
    • 2019-10-01
    • 2011-02-11
    • 2014-11-19
    • 2018-10-21
    相关资源
    最近更新 更多