我部署了一個angular工程 基於nodejs HTTP-server啟動的,登陸url:http://localhost:9000/#/login
java工程專案 登陸url: http://localhost:8060/login
而我現在想在angular工程上完全只是調用java工程項目接口,而java項目現在準備純碎只是為angular工程提供返回的json數據而已
過程中出現跨域問題,我就在java工程上統一設定攔截器 在有新請求呼叫時都設定回應頭:
response.setHeader("Access-Control-Allow-Origin" , "*" ); 即可解決跨域問題;
但session遺失問題沒解決
是說我在angular專案呼叫登陸介面登陸,伺服器端會建立一個session,並傳回使用者資訊及權限資訊等json資料 ,還有回傳一個jsessionid到客戶端;
如圖:
登陸成功跳轉至http://localhost:9000/#/home
但是我在首頁點擊左側選單執行java工程的其他接口時,比如說查詢用戶列表接口,它又被攔截掉,返回login接口,因為由請求頭中找不到對應的jsessionid,相當於當前用戶還處於未登陸狀態
原理是:每次呼叫介面即發出新請求首先都會判斷url上是否攜帶jsession,如果沒有,則判斷請求頭的cookies中有jsession,如果已存在,則會傳到後台,後台透過jsession取得對應session;可是如果jsession不存在或透過jsession取得不到對應session的話,則會從新建立一個session
我想問一下就是怎麼才能避免跨域呼叫介面導致session遺失呢?
所以到現在都沒有解決方案麼。 。
update
我解決了。後端是Java springboot,前端是angular,跨域json通訊。
cors方式,配置一個corsfilter,程式碼如下:
這個配置在不少地方應該可以找到,不同的主要是兩點:
1。 response.setHeader("Access-Control-Allow-Credentials","true"); //是否支援cookie跨域
2。 response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
首先,配置了allow-credentials之後,如果allow-origin設為*,跨域時會報錯說因為允許credentials,origin不能設為通配*,那所以設為簡單的某個domain也是可以的,這種寫法應該就是達到了任意domain都可以的效果吧。
然後angular部分也要設定個東西,舉個栗子~
恩就是這個$http.get(url, {withCredentials: true})。
ok就醬。
Access-Control-Allow-Origin設定為*只是用來解決post請求跨域的問題的,cookie是沒法跨域的,或者說只能跨2級域名,每個cookie都會有對應的域,寫的時候可以指定為允許同一個1級域名下的所有2級域名訪問,例如sf的
既然是ng工程,你的載入頁面應該只有一個,讓java這邊幫你做一個入口,回到這個頁面就好了。
引出的問題可能是你的angular模板如果都需要非同步載入,也會跨域,一個方案是像你上面那樣加上origin,另一個是直接將模板也打包成腳本直接加入進去
有解決方案了嗎?