首先說下幾個解決方案:javascript
1.jsonp前端
2.CORSjava
3.代理jquery
4.iframeajax
這裏說一下 1 2 4 我遇到的問題json
1.jsonp 實際原理是加載遠程js,因此返回的數據是一個能夠執行的javasript代碼,很明顯若是你返回一段字符串 瀏覽器報錯 .跨域
2.cors 在服務器端 填寫 (response.setHeader("Access-Control-Allow-Origin","* "));瀏覽器
在後臺中禁止使用跳轉重定向 瀏覽器報錯 302安全
4.iframe 加載一個的頁面 須要在每一個鏈接上加上遠程服務器地址 好比 咱們通常寫/ 這樣的話 會默認執行location的地址 就是瀏覽器中的地址 很明顯 會出現各類問題服務器
***
網上有不少博客,我在這裏說寫本身的體會 說點不同的
***
jsonp 是jquery 封裝的一個ajax
在定義ajax的時候 須要jsoncallback參數
不少博文裏面會寫到修改服務器的返回值 返回值是 callback+(返回值)
這裏有兩點注意
一 是必定要寫上callback 這個方法名 這東西能夠前臺自定義 若是沒有jquery自動生成一個惟一方法名稱
二 是返回值是符合jsonp格式的
這兩點 太讓人難受了
由於不少系統是多方開發的 沒誰配合你修改這 修改那裏
那怎麼辦呢?
這裏給你們說一下個人解決辦法
首先 這個是jquery封裝的
那麼你們能夠看一下jquery的源代碼 進行修改
或者重寫代碼
// Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { ............................ isSuccess = ajaxConvert( s, response );// 這裏對服務器的響應數據進行轉換 statusText = isSuccess.state; success = isSuccess.data; error = isSuccess.error; isSuccess = !error; // Chain conversions given the request and the original response function ajaxConvert( s, response ) { .... ... if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s["throws"] ) { response = conv( response ); } else { try { response = conv( response );// 這裏對服務器的響應數據進行轉換 } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } 這裏conv( response );會執行 // Install script dataType jQuery.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /(?:java|ecma)script/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } }); converters 方法 這裏 的text 就是服務器響應內容 看到這裏 你們是否是明白了? 在前端獲得了數據 想怎麼編輯數據均可以了 jQuery.globalEval( text ); // 執行javascript代碼 固然你能夠不執行 // alert(123) // var o =JSON.parse(text); alert(o.msg); so ....
後續遇到的問題
用於單點登陸
關於跨域cookie的寫入問題
看了好多博文都沒弄明白
這裏說下兩個解決辦法
1. 用jsonp 跨域請求 服務器 設置cookie response.addCookie
2.用iframe跨域網站 得到頁面代碼 設置cookie
3.a獲得b站的憑證(須要保存的cookie)以後 跳轉b站的時候 當作參數再傳回去 b站響應的時候 在設置cookie
4.a站跳轉到b站的一箇中間頁面 好比歡迎回來 繼續跳轉 這樣的頁面 這個頁面添加b站cookie 而且重定向到b站要訪問的頁面 缺點很明顯 就是須要中間過渡頁面
我用的是第三種辦法
前面兩種收到大坑框架限制
坑1: ajax cookie 設置了安全訪問限制 須要https
坑2: iframe 設置了同源訪問權限 也就是說跨域不能訪問