解决Spring Boot+AngularJS因为跨域导致Session丢失问题

2018-03-21 22:21:17
1600次阅读
0个评论
在我们每一次的数据请求中,浏览器都会向后台发送一个JSession,后台会根据这个值自动查找Id为JSession的那个session对象。但是当跨域时,JSession的值每次都会改变,后台就会以为是新的一个会话打开,于是又去创建了一个新的Session对象,而原来的Session对象就找不到了。

解决这个问题的方法很简单

首先在Angular请求中将withCredentials设为true,然后每次请求的头中就会带有cookie的值,cookie中就记录了JSession值,因此Session就不会丢失了。

在AngularJS中,可以通过全局设置,使得withCredentials为true

var utils = angular.module('Utils', []);  
    utils.config(['$httpProvider', config]);  
    function config($httpProvider) {  
            $httpProvider.defaults.withCredentials = true;  
    }

然后让在所有的app中都注入'Utils',就会将所有的请求头中的withCredentials设置为true,这样Session就不会丢失啦。
当然也可以通过以下方法来设置当前请求的withCredentials。

$http.xhr.withCredentials

然后在后台也开启.withCredentials

@Configuration  
public class CorsConfig extends WebMvcConfigurerAdapter {  
  
    @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        registry.addMapping("/**")  
                .allowedOrigins("*")  
                .allowCredentials(true)//就是这个 
                .allowedMethods("GET", "POST", "DELETE", "PUT")  
                .maxAge(3600);  
    }  
  
}

那么.withCredentials是干嘛的呢?
它需要前后端一起开启,开启之后就能够读写浏览器的Cookies,但是这个Cookies是完全由你要请求站点控制的,我们无法通过js去获取或改变Cookies中的值。

收藏00

登录 后评论。没有帐号? 注册 一个。