您好我面临Spring安全+ Spring MVC +角度javascript的问题。当会话无效时,我想请求(整个)页面重定向到登录页面。
我试过了<session-management invalid-session-url="/login" />
但是它不起作用,因为它是一个单页的应用程序......
或者在角度javascript单页面应用中处理sessiontimeout的任何建议
任何帮助?
答案 0 :(得分:4)
您可以像HTTP interceptors一样编写或使用https://github.com/witoldsz/angular-http-auth来捕获超时问题。
基本上,当会话到期时,任何服务器请求都开始返回401,可以使用HTTP拦截器进行捕获,并且可以执行必要的重定向。
答案 1 :(得分:2)
我制作了一个简单的代码来检查会话超时并重定向到登录页面以获得spring security。 它不是一个智能解决方案,但返回状态为200,响应不包含重定向信息。
var app = angular.module("app");
app.factory("sessionInjector", ['$log', function($log){
return {
request: function(config) {return config;},
response: function(response) {
if (typeof response.data === "string" && response.data.indexOf("login") > -1) {
alert("Session expired.");
location.reload();
}
return response;
}
};
}]);
app.config(["$httpProvider", function($httpProvider){
$httpProvider.interceptors.push("sessionInjector");
}]);
答案 2 :(得分:0)
我在Spring Security的一端通过简单的配置解决了这个问题,在angularjs的一端通过Http Interceptor解决了这个问题:
Spring安全配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.authorizeRequests()
.antMatchers("/somePage").hasRole("SOME_ROLE")
.and()
.formLogin()
.and()
.authorizeRequests()
.antMatchers("**/api/**").hasRole("SOME_ROLE")
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.logout()
.invalidateHttpSession(true)
.logoutSuccessUrl("/login")
.and()
.sessionManagement()
.maximumSessions(1);
}
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
angularjs代码:
app.config(['$httpProvider',
function ($httpProvider) {
$httpProvider.interceptors.push('httpInterceptor');
...
}])
app.factory("httpInterceptor", ["$q", "$window", "$log",
function ($q, $window, $log) {
return {
responseError: function(response) {
switch (response.status) {
case 401:
case 403:
$window.location.reload();
return;
}
}
}
}]);
当将formLogin()用于页面,将httpBasic()用于API调用时 以及管理会话,当您访问站点页面时,您将被重定向到登录页面,并且在未经身份验证的API调用上将获得401状态代码,该代码可以由angular的拦截器捕获,然后您可以重新加载页面或执行任何操作需要做
希望这会有所帮助:)