跨域是指跨網域名稱的訪問,以下情況都屬於跨域:
跨域原因說明
示例網域名稱不同
www.jd.com
與www.taobao.com
網域名稱相同,埠不同
www.jd.com:8080
與www.jd.com:8081
二級網域名稱不同
item.jd.com
與miaosha.jd.com
如果網域名稱和埠都相同,但是請求路徑不同,不屬於跨域,如:
跨域不一定會有跨域問題。
因為跨域問題是瀏覽器對於ajax請求的一種安全限制:乙個頁面發起的ajax請求,只能是於當前頁同網域名稱的路徑,這能有效的阻止跨站攻擊。
因此:跨域問題 是針對ajax的一種限制。
ajax請求時,如果存在跨域現象,並且沒有進行解決,會有如下表現
目前比較常用的跨域解決方案有3種:
nginx反向**
思路是:利用nginx反向**把跨域為不跨域,支援各種請求方式
缺點:需要在nginx進行額外配置,語義不清晰
cors
規範化的跨域請求解決方案,安全可靠。
優勢: 缺點:
瀏覽器會將ajax請求分為兩類,其處理方案略有差異:簡單請求、特殊請求。
簡單請求
只要同時滿足以下兩大條件,就屬於簡單請求。:
(1) 請求方法是以下三種方法之一:
(2)http的頭資訊不超出以下幾種字段:
當瀏覽器發現發現的ajax請求是簡單請求時,會在請求頭中攜帶乙個字段:origin
.
origin中會指出當前請求屬於哪個域(協議+網域名稱+埠)。服務會根據這個值決定是否允許其跨域。
如果伺服器允許跨域,需要在返回的響應頭中攜帶下面資訊:
注意:
如果跨域請求要想操作cookie,需要滿足3個條件:
特殊請求
不符合簡單請求的條件,會被瀏覽器判定為特殊請求,,例如請求方式為put。
預檢請求特殊請求會在正式通訊之前,增加一次http查詢請求,稱為"預檢"請求(preflight)。
瀏覽器先詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動詞和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的xmlhttprequest
請求,否則就報錯。
乙個「預檢」請求的樣板:
與簡單請求相比,除了origin以外,多了兩個頭:
預檢請求的響應服務的收到預檢請求,如果許可跨域,會發出響應:
除了access-control-allow-origin
和access-control-allow-credentials
以外,這裡又額外多出3個頭:
事實上,springmvc已經幫我們寫好了cors的跨域過濾器:corsfilter ,內部已經實現了剛才所講的判定邏輯,我們直接用就好了。
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.web.cors.corsconfiguration;
import org.springframework.web.cors.urlbasedcorsconfigurationsource;
import org.springframework.web.filter.corsfilter;
/** * @author: 98
* @date: 2019-7-20 11:05
*/@configuration
public
class
globalcorsconfig
}
ajax跨域問題
ajax跨域和js的跨域通訊 cross the site 的幾種解決方案 1.什麼引起了ajax跨域不能的問題 ajax本身實際上是通過xmlhttprequest物件來進行資料的互動,而瀏覽器出於安全考慮,不允許js 進行跨域操作,所以會警告。2.有什麼完美的解決方案麼?沒有。解決方案有不少,但...
ajax跨域問題
首先什麼是跨域,產生跨域的條件是什麼。在軟體的開發過程中,我們可能會遇到這這樣的問題,瀏覽器會報這樣的錯誤。這種其實就是跨域問題,但是,是什麼原因造成的這個問題呢,造成這個問題有三種方式,如下 請求的埠和當前伺服器不同 例如localhost 8080和localhost 8081 請求屬於同一網域...
AJAX跨域問題
前後端分離開發的模式下,存在前端頁面只能請求同乙個域下的後端介面,如果不是同乙個域,就會產生跨域問題。1.瀏覽器限制,並而不是伺服器後台不允許呼叫。2.跨域 協議,網域名稱 ip 埠,任何乙個不一樣,瀏覽器就會認為是跨域 3.我們傳送的是xhr xmlhttprequest請求 1.瀏覽器限制 我們...