当会话超时时,如何将spring security的响应发送到angularjs应用程序?

时间:2014-12-23 17:08:01

标签: java angularjs spring spring-mvc spring-security

事先抱歉我的英语。 我目前正在开发一个应用程序,弹簧启动和angularjs作为前端,spring mvc作为后端,所有这些都是弹簧启动,我的问题是,我使用弹簧安全性进行简单的表单登录,如此

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 //短会话,例如

我正面临着两种情况,第一种,当我退出时说不好,好的,这意味着它再次创建会话,当我再次尝试登录时,它说错误的用户名或密码,因为它每个用户只允许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

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 个答案:

答案 0 :(得分:0)

fwiw 6个月后......

默认情况下,一旦会话超时,弹出安全性就会响应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());
    }
}