解决Spring Boot+AngularJS因为跨域导致Session丢失问题
2018-03-21 22:21:17
1758 次阅读
0 个评论
在我们每一次的数据请求中,浏览器都会向后台发送一个JSession,后台会根据这个值自动查找Id为JSession的那个session对象。但是当跨域时,JSession的值每次都会改变,后台就会以为是新的一个会话打开,于是又去创建了一个新的Session对象,而原来的Session对象就找不到了。
解决这个问题的方法很简单
首先在Angular请求中将withCredentials设为true,然后每次请求的头中就会带有cookie的值,cookie中就记录了JSession值,因此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
相关话题
- springboot跨域配置
- Ajax跨域上传文件
- Spring Boot指定某个Controller支持跨源请求,以及如何让Controller类某个成员方法支持跨源请求
- Spring+redis实现session集群
- spring boot集成Hibernate配置
- 解决IE浏览器不支持Spring MVC 文件下载的问题
- Spring Boot启动时执行指定方法
- SImpleImage解决图片压缩变红问题
- Spring Boot配置@ConditionalOnProperty来控制Configuration是否生效
- 解决kindeditor中onkeydown不执行的问题
- DateTimeFormatter替换SimpleDateFormat解决线程安全问题
- spirng-boot利用spring-security实现token权限系统
- spring boot拦截器验证token防止表单重复提交
- jackson Spring boot 枚举类型不区分大小写映射
- SpringMVC获取Request域