springcloud 實戰 網關zuul使用中遇到的相關問題
1.網關zuul使用時,跨域問題
在網關中配置pre過濾器:
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); response.addHeader("access-control-Allow-Headers","*"); response.addHeader("Access-Control-Allow-Methods","*"); response.addHeader("Access-Control-Max-Age","3600");//預檢請求的緩存時間(秒),即在這個時間段里,對於相同的跨域請求不會再預檢了 response.addHeader("Access-Control-Expose-Headers","Set-Cookie,REDIRECT,CONTENTPATH");//允許訪問的頭信息 response.addHeader("Access-Control-Allow-Credentials","true");//允許Cookie跨域,在做登錄校驗的時候有用
2.網關zuul使用時,session沒有傳遞到微服務,微服務和網關中的sessionId不一致
1> 保證網關中的sessionId 和 后端微服務一致。
zuul.sensitiveHeaders="*"
2>session共享時,將用戶第一次登陸校驗放在網關處理,在網關中將用戶新存入session,返回請求,
第二次請求時前端會攜帶第一次的網關中的sessionID,經過網關,后端微服務。
注意:如果用戶session校驗邏輯放在網關,而將user寫入session的邏輯放在后端微服務,則第一次請求后,返回到web前端會存在兩個sessionId, 一個是網關中生成的,一個是微服務中生成的,導致第二次請求會取出最后一個sessionId(微服務中生成的),
而該sesssionId在網關中是無法取出用戶信息的,仍然提示用戶未登錄,該場景,需要先通過一次其他請求(比如隱藏一個不校驗的圖片地址請求)消耗掉第一次請求的sessionId不一致的問題。
建議直接將用戶session的寫入和校驗都放到網關中進行處理。
3.網關zuul使用時,請求超時
ribbon.ReadTimeout=60000 ribbon.ConnectTimeout=60000 zuul.host.connect-timeout-millis=30000 zuul.host.socket-timeout-millis=30000