会话超时时,如何从 Spring Security 向 angularjs 应用程序发送响应?

Posted

技术标签:

【中文标题】会话超时时,如何从 Spring Security 向 angularjs 应用程序发送响应?【英文标题】:How do i send a response from spring security to an angularjs app when session is timed out? 【发布时间】:2015-02-21 20:45:05 【问题描述】:

事先对我的英语感到抱歉。 我目前正在开发一个应用程序,它使用 spring boot 和 angularjs 作为前端,spring mvc 作为后端,所有这些都使用 spring boot,我的问题是,我正在使用 spring security 进行简单的表单登录,像这样

http
.csrf().disable()
.authorizeRequests()
.antMatchers("/css/**").permitAll()
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true);
http
.sessionManagement()
.maximumSessions(1)//max session per user
.expiredUrl("/login?expired")
.maxSessionsPreventsLogin(true);

我实现的httpsessionlistener就这么简单

@Configuration
public class SessionListener implements HttpSessionListener  

@Override
public void sessionCreated(HttpSessionEvent se) 
System.out.println("ok");



@Override
public void sessionDestroyed(HttpSessionEvent se) 
  System.out.println("not ok");





和我的Application.java就这么简单

public class Application 

public static void main(String[] args) 
    SpringApplication.run(Application.class, args);
    //Get process id, es para el wrapper de java



在我的 application.proterties 这个 server.session-timeout=5//短会话为例

我面临 2 种情况,第一种,当我注销时它说不行,好的,这意味着它正在再次创建会话,当我尝试再次登录时,它说用户名或密码错误,因为它只允许每个用户 1 个会话。 我的注销按钮只是像这样来自 angularjs 的一个简单请求

this.logout=function($scope)

    var LogOut = resource('/sticker/logout');
    LogOut.get(function(message)
        //window.location.href="login?logout";
        console.log(message);
        //scope.message = message.message;
    );


第二种情况是,当会话到期并且我从 angularjs 发出请求时它返回登录页面,我正在使用我从interceptors in angularjs 获取的以下代码 sn-p 捕获此响应

app.factory("httpInterceptor", ["$q", "$window", "$log",
                         function ($q, $window, $log) 
                           return 
                            "response": function (response) 
                               var responseHeaders;
                               console.log(response);
                               responseHeaders = response.headers();

                               return response;
                             
                           ;
                        

                       ])

我希望能够返回类似 httpresponse og 440 的东西 任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

6 个月后...

默认情况下,一旦会话超时,spring security 会以 403 响应。我通过将以下内容添加到 HttpSecurity 配置中,让它以 401(未经授权)响应:

@Configuration
@EnableWebSecurity
public class ServerSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        ...
        http.exceptionHandling().accessDeniedHandler(accessDeniedHandler());
        ...
    

    private AccessDeniedHandler accessDeniedHandler() 
        return (request, response, ex) ->
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, ex.getLocalizedMessage());
    

【讨论】:

以上是关于会话超时时,如何从 Spring Security 向 angularjs 应用程序发送响应?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security saml 的 IDP 会话超时

ajax 调用无法识别 Spring Security 会话超时

Grails Spring Security - 会话超时后重新登录时重新加载会话变量

会话超时时如何自动刷新

如何在会话超时时关闭所有活动的引导模式?

Asp.Net MVC 2中会话超时时的确认