為什麼會跨域,要先了解瀏覽器的同源策略sop(same orign policy)
同源:
如果兩個頁面的協議,埠(如果有指定)和主機位址都相同,則兩個頁面具有相同的源。
協議/主機/埠
跨源網路訪問
同源策略控制了不同源之間的互動,例如在使用xmlhttprequest時會受到同源策略的約束。即同源策略限制了從乙個源載入的文件或者指令碼如何與另乙個源的資源進行互動。這是乙個用於隔離潛在惡意檔案的重要安全機制。
如果沒有同源策略限制的介面請求則容易被csrf攻擊,下面是csrf攻擊的原理:
解決方案:
cors是乙個w3c標準,全稱是"跨域資源共享"(cross-origin resource sharing)。
它允許瀏覽器向跨源伺服器,發出xmlhttprequest請求,從而克服了ajax只能同源使用的限制。
cors需要瀏覽器和伺服器同時支援。
所有瀏覽器都支援該功能,ie瀏覽器不能低於ie10。
整個cors通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,cors通訊與同源的ajax通訊沒有差別,**完全一樣。瀏覽器一旦發現ajax請求跨源,就會自動新增一些附加的頭資訊,有時還會多出一次附加的請求,但使用者不會有感覺。
實現cors通訊的關鍵是伺服器。只要伺服器實現了cors介面,就可以跨源通訊。
即cors與普通請求**一樣。
cors與jsonp相比
jsonp只能實現get請求,而cors支援所有型別的http請求。
使用cors,開發者可以使用普通的xmlhttprequest發起請求和獲得資料,比起jsonp有更好的錯誤處理。
jsonp主要被老的瀏覽器支援,它們往往不支援cors,而絕大多數現代瀏覽器都已經支援了cors。
cors全稱為cross origin resource sharing(跨域資源共享), 每乙個頁面需要返回乙個名為access-control-allow-origin的http頭來允許外域的站點訪問,你可以僅僅暴露有限的資源和有限的外域站點訪問。
我們可以理解為:如果乙個請求需要允許跨域訪問,則需要在http頭中設定access-control-allow-origin來決定需要允許哪些站點來訪問,如要允許www.baidu.com這個站點的請求跨域,則可以設定:
access-control-allow-origin:
cros跨域常用header
access-control-allow-origin: 允許哪些ip或網域名稱可以跨域訪問
access-control-max-age: 表示在多少秒之內不需要重複校驗該請求的跨域訪問許可權
access-control-allow-methods: 表示允許跨域請求的http方法,如:get、post、put、delete
access-control-allow-headers: 表示訪問請求中允許攜帶哪些header資訊,如:accept、accept-language、content- language、content-type
spring中解決跨域問題的方案:
1、@crossorigin註解
此註解既可用於方法也可用於類
示例如下:
@crossorigin(origins = "")public
result getalloldproductions()
@crossorigin
註解既可註解在方法上,也可註解在類上。
2、xml全域性配置
所有跨域請求都可以訪問
更加細粒度的配置:
springboot解決跨域問題配置
1、使用@crossorigin註解,同上
2、使用corsfilter進行全域性跨域配置
@configurationpublic
class
globalcorsconfig
}
@bean或者:public
webmvcconfigurer crosconfigurer() };}
import4、過濾器實現org.springframework.context.annotation.configuration;
import
org.springframework.web.servlet.config.annotation.corsregistry;
import
org.springframework.web.servlet.config.annotation.webmvcconfigurer;
@configuration
public
class globalcorsconfig implements
webmvcconfigurer
}
@componentend.public
class corsfilter implements
filter
chain.dofilter(request, response);
}@override
public
void init(filterconfig filterconfig) throws
servletexception
@override
public
void
destroy()
}
cookie跨域問題 跨域登入
cookie跨域時修改不成功,需要在刪除 或者修改時 設定domain值與存入的domain一致,跨域修改cookie不會成功。例如 login.abc.com login工程 www.abc.com abc工程 www.abc.com login.html呼叫login工程的登陸介面 login工...
跨域問題詳解 ajax跨域解決
跨域問題的產出,根本原因在於瀏覽器的同源策略,什麼又是同源策略呢,官方解釋 同源策略限制了從同乙個源載入的文件或指令碼如何與來自另乙個源的資源進行互動。這是乙個用於隔離潛在惡意檔案的重要安全機制。同源的定義 如果兩個頁面的協議,埠 如果有指定 和網域名稱都相同,則兩個頁面具有相同的源。可以跨域讀取其...
Jq 跨域問題
ajax 跨域問題解決方案 jsonp 1 前台ajax 2 後台響應 string info string callbackfunname request callbackparam string k ok response.write var data k r n info info callb...