背景:最近項目進行重構,微服務架構,項目分成多個模塊,在用戶同步的時候發生了跨域操作。將門戶模塊的用戶信息加密後,通過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