会话超时时,如何从 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 会话超时