ajax 請求本網域名稱下的一個方法 userInfo,擷取使用者資訊,但是在擷取使用者資訊的userInfo方法,是使用了單點登入系統的,所以擷取資訊的過程存在跨域,這樣ajax 請求就會報錯,請問如何解決?
回複內容:
ajax 請求本網域名稱下的一個方法 userInfo,擷取使用者資訊,但是在擷取使用者資訊的userInfo方法,是使用了單點登入系統的,所以擷取資訊的過程存在跨域,這樣ajax 請求就會報錯,請問如何解決?
我想到方法
1- 使用本地的php通過curl擷取,這樣ajax只要請求本地的php就不會發生跨域了,而PHP端的curl是沒有跨域限制的。
2- 宿主端提供js指令碼,伴生系統引用該js,並調用其中聲明的方法進行ajax請求就不屬於跨域了。
通常我都是用方法1,方法2需要宿主端系統的開發人員配合,太麻煩。
在php層做一個代理,讓php請求那個跨域介面,然後php再把資料返回到頁面上。
這個介面不能用jsonp,不是不能實現,是不安全。不能泄漏使用者資訊,因為是userinfo,所以必須注重安全問題。
跨域時,地址參數中要加一個回呼函數,在js裡,在這個回呼函數裡處理返回的資料。這裡有一個post的跨域,可以參考一下。https://github.com/limeng0403/libs/blob/master/EOF/getJSON%E5%9C%A8PHP%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%AE%9E%E7%8E%B0%E8%B7%A8%E5%9F%9F%E6%95%B0%E6%8D%AE%E5%8A%A0%E8%BD%BD.md
使用ajax jsonp
純GET
請求可以用jsonp
支援CORS
的瀏覽器,可用CORS
請求資料步驟
發送請求--->伺服器響應返回--->瀏覽器接受響應--->判斷是否是同域下
是的話,就把響應資料返回給ajax。不是的話就提醒禁止跨域請求。
其實服務端可以在回應標頭中增加
header("Access-Control-Allow-Origin: 允許的網域");
header("Access-Control-Allow-Methods: 允許請求的方法");
header("Access-Control-Allow-Headers: X-PINGOTHER");
告訴瀏覽器可以把響應值返回給此請求
參考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
跨域可以參考下面這篇文章
http://www.cnblogs.com/duanhuajian/p/4211616.html
header('content-type:application:json;charset=utf8');
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST');
header('Access-Control-Allow-Headers:x-requested-with,content-type');
在你的php檔案中添加上這個
可以使用JSONP請求
我剛剛整理的解決跨域請求的三種方法:https://segmentfault.com/a/1190000004539815
postMessage();onmessage。
最好的是使用php curl代理過去,控制度高一點。
第二就是修改伺服器介面檔案,開啟跨域限制,這樣ajax就可以調用了。
第三就是建議樓主用jsonp了。
具體單點登入系統內部怎麼實現的沒有去看,奇怪的一點是,如果我通過瀏覽器直接存取userInfo方法 是可以擷取使用者的資訊,然後ajax 再請求userInfo 方法 就能正常返回使用者資訊了,很是奇怪,所以我用了一個很笨的方法,就是在頁面底部用了一個iframe,iframe載入應該是一次http請求,就正常了!但直接存取為什麼報跨域的錯誤的原因還是沒有找到,感謝大家的回答! @incNick @大猛 @張亞濤 @ 等等……