免费国产午夜视频在线_日韩一区二区三区91_日本高清视频在线网站_无码αⅴ视频在线观看_亚洲永久免费播放片app一_国产爆乳呻吟在线观看_欧洲 日韩 国产 精品_久久w免费人成看片中文_色婷婷日日躁夜夜躁_亚洲国产网红无码播放

  • 相關文章
    建站教程
    當前位置:啟肯科技> 新聞資訊> 建站教程> 詳情頁

    js跨越自定義header實現跨域訪問

    TAG: js跨越(1) js文件(1) 時間:2018-08-02 瀏覽:0

    受瀏覽器的同源策略限制,JavaSript只能請求本域內的資源。跨域資源共享(Cross-Origin Resource Sharing, CORS)是為解決Ajax技術難實現跨域問題而
    提出的一個規(guī)范,這個規(guī)范試著從根本上解決安全的跨域資源共享問題。在此之前,解決此類問題的途徑往往是服務器代理、JSONP等,治標不治本。目
    前基本所有瀏覽器都已經支持該規(guī)范。
    一個域是由schema、host、port三者共同組成,與路徑無關。所謂跨域,是指在http://example-foo.com/域上通過XMLHttpRequest對象調用http://example-
    bar.com/域上的資源。CORS約定服務器端和瀏覽器在HTTP協(xié)議之上,通過一些額外HTTP頭部信息,進行跨域資源共享的協(xié)商。服務器端和瀏覽器都必
    需遵循規(guī)范中的要求。
    CORS把HTTP請求分成兩類,不同類別按不同的策略進行跨域資源共享協(xié)商。
    1. 簡單跨域請求。
    當HTTP請求出現以下兩種情況時,瀏覽器認為是簡單跨域請求:
    1). 請求方法是GET、HEAD或者POST,并且當請求方法是POST時,Content-Type必須是application/x-www-form-urlencoded, multipart/form-data或著tex
    t/plain中的一個值。
    2). 請求中沒有自定義HTTP頭部。
    對于簡單跨域請求,瀏覽器要做的就是在HTTP請求中添加Origin Header,將JavaScript腳本所在域填充進去,向其他域的服務器請求資源。服務器端收
    到一個簡單跨域請求后,根據資源權限配置,在響應頭中添加Access-Control-Allow-Origin Header。瀏覽器收到響應后,查看Access-Control-Allow-Origin
    Header,如果當前域已經得到授權,則將結果返回給JavaScript。否則瀏覽器忽略此次響應。
    2. 帶預檢(Preflighted)的跨域請求。
    當HTTP請求出現以下兩種情況時,瀏覽器認為是帶預檢(Preflighted)的跨域請求:
    1). 除GET、HEAD和POST(only with application/x-www-form-urlencoded, multipart/form-data, text/plain Content-Type)以外的其他HTTP方法。
    2). 請求中出現自定義HTTP頭部。
    帶預檢(Preflighted)的跨域請求需要瀏覽器在發(fā)送真實HTTP請求之前先發(fā)送一個OPTIONS的預檢請求,檢測服務器端是否支持真實請求進行跨域資源訪
    問,真實請求的信息在OPTIONS請求中通過Access-Control-Request-Method Header和Access-Control-Request-Headers Header描述,此外與簡單跨域
    請求一樣,瀏覽器也會添加Origin Header。服務器端接到預檢請求后,根據資源權限配置,在響應頭中放入Access-Control-Allow-Origin Header、Access-
    Control-Allow-Methods和Access-Control-Allow-Headers Header,分別表示允許跨域資源請求的域、請求方法和請求頭。此外,服務器端還可以加入Acce
    ss-Control-Max-Age Header,允許瀏覽器在指定時間內,無需再發(fā)送預檢請求進行協(xié)商,直接用本次協(xié)商結果即可。瀏覽器根據OPTIONS請求返回的結
    果來決定是否繼續(xù)發(fā)送真實的請求進行跨域資源訪問。這個過程對真實請求的調用者來說是透明的。
    XMLHttpRequest支持通過withCredentials屬性實現在跨域請求攜帶身份信息(Credential,例如Cookie或者HTTP認證信息)。瀏覽器將攜帶Cookie Header
    的請求發(fā)送到服務器端后,如果服務器沒有響應Access-Control-Allow-Credentials Header,那么瀏覽器會忽略掉這次響應。
    這里討論的HTTP請求是指由Ajax XMLHttpRequest對象發(fā)起的,所有的CORS HTTP請求頭都可由瀏覽器填充,無需在XMLHttpRequest對象中設置。以下
    是CORS協(xié)議規(guī)定的HTTP頭,用來進行瀏覽器發(fā)起跨域資源請求時進行協(xié)商:
    1. Origin。HTTP請求頭,任何涉及CORS的請求都必需攜帶。
    2. Access-Control-Request-Method。HTTP請求頭,在帶預檢(Preflighted)的跨域請求中用來表示真實請求的方法。
    3. Access-Control-Request-Headers。HTTP請求頭,在帶預檢(Preflighted)的跨域請求中用來表示真實請求的自定義Header列表。
    4. Access-Control-Allow-Origin。HTTP響應頭,指定服務器端允許進行跨域資源訪問的來源域?梢杂猛ㄅ浞*表示允許任何域的JavaScript訪問資源,但
    是在響應一個攜帶身份信息(Credential)的HTTP請求時,Access-Control-Allow-Origin必需指定具體的域,不能用通配符。
    5. Access-Control-Allow-Methods。HTTP響應頭,指定服務器允許進行跨域資源訪問的請求方法列表,一般用在響應預檢請求上。
    6. Access-Control-Allow-Headers。HTTP響應頭,指定服務器允許進行跨域資源訪問的請求頭列表,一般用在響應預檢請求上。
    7. Access-Control-Max-Age。HTTP響應頭,用在響應預檢請求上,表示本次預檢響應的有效時間。在此時間內,瀏覽器都可以根據此次協(xié)商結果決定是否
    有必要直接發(fā)送真實請求,而無需再次發(fā)送預檢請求。
    8. Access-Control-Allow-Credentials。HTTP響應頭,凡是瀏覽器請求中攜帶了身份信息,而響應頭中沒有返回Access-Control-Allo
    w-Credentials: true的,瀏覽器都會忽略此次響應。
    總結:只要是帶自定義header的跨域請求,在發(fā)送真實請求前都會先發(fā)送 OPTIONS請求,瀏覽器根據OPTIONS請求返回的結果來決定是否繼
    續(xù)發(fā)送真實的請求進行跨域資源訪問。所以復雜請求肯定會兩次請求服務端。
    js 端的ajax請求:
    [javascript] 
    1.  $.ajax({
    2.  url: "http://test.com",
    3.  dataType: 'json',
    4.  type: 'GET',
    5.  beforeSend: function (xhr) {
    6.  xhr.setRequestHeader("Test", "testheadervalue");
    7.  },
    服務端的action
    8.  async: false,
    9.  cache: false,
    10.  //contentType: 'application/x-www-form-urlencoded',
    11.  success: function (sResponse) {
    12.  }
    13.  });
    [csharp] 
    1.  //允許跨域訪問
    2.  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    3.  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT");
    4.  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Test");
    說點什么吧
    • 全部評論(0
      還沒有評論,快來搶沙發(fā)吧!