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

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