SpringBoot前后端分离跨域导致的Sessionid不一致问题解决办法

背景:最近项目进行重构,微服务架构,项目分成多个模块,在用户同步的时候发生了跨域操作。将门户模块的用户信息加密后,通过ajax请求发送给其他模块,例如meta模块,meta模块拿到加密的用户信息后进行解析,然后将用户信息保存到session中。然后发现每次请求,meta模块的sessionid都不同,导致保存在session中的用户信息无效,每次都得重新解析,某些请求是不带用户请求的,所以程序就出现了异常。将自己的解决办法进行总结,以便于自己以后查阅,也分享给并肩作战的同学们。

解决办法:

1、首先在后台配置文件中允许跨域请求

@Configuration
public class MetaCorsConfig implements WebMvcConfigurer {

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		//设置允许跨域的路径
        registry.addMapping("/**")
                //设置允许跨域请求的域名
                .allowedOrigins("*")
                //是否允许证书 不再默认开启
                .allowCredentials(true)
                //设置允许的方法
                .allowedMethods("*")
                //跨域允许时间
                .maxAge(3600);
	}
}

2、前端发起ajax请求允许跨域

xhrFields: {
    withCredentials: true
}

至此,sessionid在一个模块中可以得到一致。

出现新的问题:console模块作为门户,进入门户后首先向meta发起请求,然后再向console发起请求。就会发现console模块的session会出现混乱不一致问题。

出现问题的原因:因为http请求时无状态的,在很多场景下需要保持同一中状态,比如用户登录状态。所以为了解决此种场景问题。前端在发起ajax请求的时候,后端会生成一个session。后端响应的时候会将session信息由response返回给客户端(例如:浏览器)。浏览器就会将session记录到cookie中,后续发起的请求就会携带cookie信息。相互传递的session通过sessionid来唯一标识。由于SpringBoot分模块后,每一个模块都有自己的session,但是默认的cookie那么是一样的。由于为了解决跨域问题允许客户端发起请求的时候携带cookie信息,所以请求meta时response中就会将meta模块的sessionid返回,cookie那么叫JSESSIONID。当我们再向console发起请求的时候就会将meta模块返回的sessionid携带到cookie中向console模块发起请求。当然console和meta的sessionid是不同的。这就会引起console模块出现sessionid不一致问题。

解决办法:在springboot配置文件中为每个模块设置属于自己的cookie.name。

例如:server.session.cookie.name=console

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章