跨域問題的產出,根本原因在於瀏覽器的同源策略,什麼又是同源策略呢,官方解釋:(同源策略限制了從同乙個源載入的文件或指令碼如何與來自另乙個源的資源進行互動。這是乙個用於隔離潛在惡意檔案的重要安全機制。)
同源的定義:如果兩個頁面的協議,埠(如果有指定)和網域名稱都相同,則兩個頁面具有相同的源。
可以跨域讀取其他源cookie,獲取使用者登入資訊;
釣魚**通過內勤iframe的方式來獲取使用者輸入資訊;
1)ajax jsonp
2) 在html標籤裡,一些標籤比如script、img這樣的獲取資源的標籤是沒有跨域限制的
示例前端**:
">>
示例後端**
out.print(jsonp+"("+gson.tojson(user)+")");
out.flush();
out.close();
return;
缺點:只能是get請求,無法傳送post請求
cors是乙個w3c標準,全稱是"跨域資源共享"(cross-origin resource sharing)跨域資源共享 cors 詳解。這是處理跨域問題的標準做法。cors有兩種請求,簡單請求和非簡單請求。
只要同時滿足以下兩大條件,就屬於簡單請求。
(1) 請求方法是以下三種方法之一:
(2)http的頭資訊不超出以下幾種字段:
非簡單請求(put/delete)會發出一次預檢測請求,返回碼是204,預檢測通過才會真正發出請求,這才返回200。這裡通過前端發請求的時候增加乙個額外的headers來觸發非簡單請求。
"預檢"請求用的請求方法是options
,表示這個請求是用來詢問的;
具體使用方法:
前端按同源方式正常訪問,使用ajax示例:
$.ajax(,
success:function(data)
});服務端返回header中需要新增欄位來滿足cors
access-control-allow-origin 該字段是必須的。它的值要麼是請求時origin
欄位的值,要麼是乙個*
,表示接受任意網域名稱的請求。如果需要跨域帶cookie 改欄位必須全匹配,不能是*,
包含origin
的請求不一定是跨域請求, 但是跨域請求一定包含origin
. 一些同源的請求同樣也會包含origin
請求頭.例如, firefox瀏覽器不會在同源的請求中新增origin
, 但是chrome和safari會在同源的post/put/delete請求中新增origin
請求頭(但是同源的get不會新增).
access-control-allow-credentials 可選,啟用cookie
access-control-allow-methods 該欄位必需,它的值是逗號分隔的乙個字串,表明伺服器支援的所有跨域請求的方法。注意,返回的是所有支援的方法,而不單是瀏覽器請求的那個方法。這是為了避免多次"預檢"請求。
access-control-allow-headers 如果瀏覽器請求包括access-control-request-headers
字段,則access-control-allow-headers
欄位是必需的。它也是乙個逗號分隔的字串,表明伺服器支援的所有頭資訊字段,不限於瀏覽器在"預檢"中請求的字段。
access-control-max-age 該欄位可選,用來指定本次預檢請求的有效期,單位為秒。上面結果中,有效期是20天(1728000秒),即允許快取該條回應1728000秒(即20天),在此期間,不用發出另一條預檢請求。
服務的**示例:
新增乙個c'rosfilter 統一設定頭部
@override
public void dofilter(servletrequest request, servletresponse response, filterchain chain)
throws ioexception, servletexception
string headers = req.getheader("access-control-request-headers");
if(!stringutils.isempty(headers))
res.addheader("access-control-allow-methods","*");
res.addheader("access-control-max-age","3600");
//enable cookie
res.addheader("access-control-allow-credentials","true");
chain.dofilter(request, response);
}使用nginx反向**,解決跨域訪問。
示例:server_name docer.test.foxitreader.cn;
解決AJAX跨域問題
解決ajax跨域問題 跨域不一定會有跨域問題。因為跨域問題是瀏覽器對於ajax請求的一種安全限制 乙個頁面發起的ajax請求,只能是於當前頁同網域名稱的路徑,這能有效的阻止跨站攻擊。因此 跨域問題 是針對ajax的一種限制。雖然原理比較複雜 import org.springframework.co...
AJAX 跨域詳解
一 什麼是 ajax 跨域問題 同源策略規定,ajax 請求 xmlhttprequest比如這個 協議是http,網域名稱是www.example.com,埠是預設的80。如果你在這個 上使用 ajax 傳送請求,就會出錯,因為網域名稱不同。ajax 跨域的根本原因是瀏覽器不允許這麼做 不是服務端...
ajax跨域問題
ajax跨域和js的跨域通訊 cross the site 的幾種解決方案 1.什麼引起了ajax跨域不能的問題 ajax本身實際上是通過xmlhttprequest物件來進行資料的互動,而瀏覽器出於安全考慮,不允許js 進行跨域操作,所以會警告。2.有什麼完美的解決方案麼?沒有。解決方案有不少,但...