摘要:用于告知瀏覽器可以將預(yù)先檢查請求返回結(jié)果緩存的時間,在緩存有效期內(nèi),瀏覽器會使用緩存的預(yù)先檢查結(jié)果判斷是否發(fā)送跨域請求。
跨域,老生常談的問題 簡述
作為一只前端菜鳥,跨域方面只懂得JSONP和CORS,并未曾深入了解。但隨著春招越來越近,就算是菜鳥也要猛振翅膀。近幾日仔細研究了跨域問題,寫下這篇文章,希望對開發(fā)者們有所幫助。在讀本文前,希望您對以下知識略有了解。
瀏覽器同源策略
nodejs
iframe
docker, nginx
我們?yōu)楹我芯靠缬騿栴}因為瀏覽器的同源策略規(guī)定某域下的客戶端在沒明確授權(quán)的情況下,不能讀寫另一個域的資源。而在實際開發(fā)中,前后端常常是相互分離的,并且前后端的項目部署也常常不在一個服務(wù)器內(nèi)或者在一個服務(wù)器的不同端口下。前端想要獲取后端的數(shù)據(jù),就必須發(fā)起請求,如果不做一些處理,就會受到瀏覽器同源策略的約束。后端可以收到請求并返回數(shù)據(jù),但是前端無法收到數(shù)據(jù)。
多種跨域方法跨域可以大概分為兩種目的
前后端分離時,前端為了獲取后端數(shù)據(jù)而跨域
為不同域下的前端頁面通信而跨域
為前后端分離而跨域 Cross Origin Resource Share (CORS)CORS是一個跨域資源共享方案,為了解決跨域問題,通過增加一系列請求頭和響應(yīng)頭,規(guī)范安全地進行跨站數(shù)據(jù)傳輸
請求頭主要包括請求頭 | 解釋 |
---|---|
Origin | Origin頭在跨域請求或預(yù)先請求中,標(biāo)明發(fā)起跨域請求的源域名。 |
Access-Control-Request-Method | Access-Control-Request-Method頭用于表明跨域請求使用的實際HTTP方法 |
Access-Control-Request-Headers | Access-Control-Request-Headers用于在預(yù)先請求時,告知服務(wù)器要發(fā)起的跨域請求中會攜帶的請求頭信息 |
with-credentials | 跨域請求攜帶cookie |
響應(yīng)頭 | 解釋 |
---|---|
Access-Control-Allow-Origin | Access-Control-Allow-Origin頭中攜帶了服務(wù)器端驗證后的允許的跨域請求域名,可以是一個具體的域名或是一個*(表示任意域名)。 |
Access-Control-Expose-Headers | Access-Control-Expose-Headers頭用于允許返回給跨域請求的響應(yīng)頭列表,在列表中的響應(yīng)頭的內(nèi)容,才可以被瀏覽器訪問。 |
Access-Control-Max-Age | Access-Control-Max-Age用于告知瀏覽器可以將預(yù)先檢查請求返回結(jié)果緩存的時間,在緩存有效期內(nèi),瀏覽器會使用緩存的預(yù)先檢查結(jié)果判斷是否發(fā)送跨域請求。 |
Access-Control-Allow-Methods | Access-Control-Allow-Methods用于告知瀏覽器可以在實際發(fā)送跨域請求時,可以支持的請求方法,可以是一個具體的方法列表或是一個*(表示任意方法)。 |
客戶端只需按規(guī)范設(shè)置請求頭。
服務(wù)端按規(guī)范識別并返回對應(yīng)響應(yīng)頭,或者安裝相應(yīng)插件,修改相應(yīng)框架配置文件等。具體視服務(wù)端所用的語言和框架而定
SpringBoot 設(shè)置CORS例子一個spring boot項目中關(guān)于CORS配置的一段代碼
HttpServletResponse httpServletResponse = (HttpServletResponse) response; String temp = request.getHeader("Origin"); httpServletResponse.setHeader("Access-Control-Allow-Origin", temp); // 允許的訪問方法 httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); // Access-Control-Max-Age 用于 CORS 相關(guān)配置的緩存 httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,token"); httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");JSONP 跨域
jsonp的原理就是借助HTML中的