您的位置:首页 > Web前端 > AngularJS

Spring Boot+AngularJS中因为跨域导致Session丢失

2016-09-06 09:35 507 查看
如果还在为跨域问题烦恼,请查看博主的 解决angular+spring
boot的跨域问题 那篇文章。

博主在项目开发过程中,遇到了由于跨域而导致的Session丢失问题,非常的恶心,但是经过在网上查阅各种资料,发现解决方法十分简单。

在我们每一次的数据请求中,浏览器都会向后台发送一个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中的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息