遇到的一個關於ajax跨域的問題

首先說下幾個解決方案: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 設置了同源訪問權限  也就是說跨域不能訪問

相關文章
相關標籤/搜索