最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript瀏覽器的跨域問(wèn)題解決方案

 更新時(shí)間:2022年11月22日 16:43:22   作者:一桿老狙  
出于瀏覽器的同源策略限制。同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會(huì)受到影響。知識(shí)點(diǎn):跨域只會(huì)出現(xiàn)在瀏覽器上,小程序和APP開發(fā)不會(huì)有跨域問(wèn)題

為什么要跨域

同源策略

瀏覽器的同源策略:是瀏覽器的一個(gè)安全功能,不同源的網(wǎng)頁(yè)腳本在沒(méi)有明確授權(quán)的情況下,不能讀寫對(duì)方的資源,也就是會(huì)阻止一個(gè)域的javascript腳本和另外一個(gè)域的內(nèi)容進(jìn)行交互

同源

同源指的是(“協(xié)議+域名+端口”)三者相同

跨域問(wèn)題

解釋:使用AJAX技術(shù)(XML HttpRequest對(duì)象),從一個(gè)網(wǎng)頁(yè)去請(qǐng)求另一個(gè)網(wǎng)頁(yè)的資源時(shí),違反了瀏覽器的同源策略,限制引起的安全問(wèn)題。

解決跨域的思路:

  • 根源上解決,不使用ajax技術(shù)
  • 授權(quán)跨域資源共享

解決跨域

(列舉三個(gè)最常用的CORS、JSONP和代理服務(wù)器nginx)

CORS

CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標(biāo)準(zhǔn),屬于跨源 AJAX 請(qǐng)求的根本解決方法。

  • 普通跨域請(qǐng)求只需要服務(wù)端設(shè)置 Access-Control-Allow-Origin
  • 帶cookie的跨域請(qǐng)求前后端都需要設(shè)置

【前端設(shè)置】根據(jù)xhr.withCredentials字段判斷是否帶有cookie

1.原生ajax寫法

var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest兼容
// 前端設(shè)置是否帶cookie
xhr.withCredentials = true;
xhr.open('post', 'http://www.domain2.com:8080/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=admin');
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
};

2.jQuery ajax

$.ajax({
   url: 'http://www.test.com:8080/login',
   type: 'get',
   data: {},
   xhrFields: {
       withCredentials: true    // 前端設(shè)置是否帶cookie
   },
   crossDomain: true,   // 會(huì)讓請(qǐng)求頭中包含跨域的額外信息,但不會(huì)含cookie
});

3.vue-resource

Vue.http.options.credentials = true

4.axios

axios.defaults.withCredentials = true

5.fetch()方法實(shí)現(xiàn)

<script>
  fetch("http://127.0.0.1:35911", // url地址
  {method: "GET"}) // 用服務(wù)器允許的方法請(qǐng)求
  .then{ resonse => response.json{} } // 
  .then{ data => console.log{data.like} };
 </script>

fetch方法的node.js后臺(tái)設(shè)置

cosnt express = require{'express '};
const cors = require{'cors'};
const app = express{};
app.use(
  cors ({
    origin:"*", // 允許所有源進(jìn)行訪問(wèn)
    methods:['GET','POST'] // 定義可以訪問(wèn)的方法
  })
);
app.get('/',{request,response} =>{
  response.json(
    {"name:"hello","wrold"}
  );
});
app.listen(35911);

【服務(wù)端設(shè)置】

服務(wù)器端對(duì)于CORS的支持,主要是通過(guò)設(shè)置Access-Control-Allow-Origin來(lái)進(jìn)行的。如果瀏覽器檢測(cè)到相應(yīng)的設(shè)置,就可以允許Ajax進(jìn)行跨域的訪問(wèn)。

1.Nodejs后臺(tái)

var http = require('http');
var server = http.createServer();
var qs = require('querystring');
server.on('request', function(req, res) {
    var postData = '';
    // 數(shù)據(jù)塊接收中
    req.addListener('data', function(chunk) {
        postData += chunk;
    });
    // 數(shù)據(jù)接收完畢
    req.addListener('end', function() {
        postData = qs.parse(postData);
        // 跨域后臺(tái)設(shè)置
        res.writeHead(200, {
            'Access-Control-Allow-Credentials': 'true',     // 后端允許發(fā)送Cookie
            'Access-Control-Allow-Origin': 'http://www.domain1.com',    // 允許訪問(wèn)的域(協(xié)議+域名+端口)
            /* 
             * 此處設(shè)置的cookie還是domain2的而非domain1,因?yàn)楹蠖艘膊荒芸缬驅(qū)慶ookie(nginx反向代理可以實(shí)現(xiàn)),
             * 但只要domain2中寫入一次cookie認(rèn)證,后面的跨域接口都能從domain2中獲取cookie,從而實(shí)現(xiàn)所有的接口都能跨域訪問(wèn)
             */
            'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'  // HttpOnly的作用是讓js無(wú)法讀取cookie
        });
        res.write(JSON.stringify(postData));
        res.end();
    });
});
server.listen('8080');
console.log('Server is running at port 8080...');

2.PHP后臺(tái)

<?php
 header("Access-Control-Allow-Origin:*");

JSONP技術(shù)原理

JSONP 是服務(wù)器與客戶端跨源通信的常用方法。最大特點(diǎn)就是簡(jiǎn)單適用,兼容性好(兼容低版本IE),缺點(diǎn)是只支持get請(qǐng)求,不支持post請(qǐng)求。

核心思想:網(wǎng)頁(yè)通過(guò)添加一個(gè)<script>元素,向服務(wù)器請(qǐng)求 JSON 數(shù)據(jù),服務(wù)器收到請(qǐng)求后,將數(shù)據(jù)放在一個(gè)指定名字的回調(diào)函數(shù)的參數(shù)位置傳回來(lái)。

1.原生實(shí)現(xiàn)

<script src="http://test.com/data.php?callback=dosomething"></script>
// 向服務(wù)器test.com發(fā)出請(qǐng)求,該請(qǐng)求的查詢字符串有一個(gè)callback參數(shù),用來(lái)指定回調(diào)函數(shù)的名字
// 處理服務(wù)器返回回調(diào)函數(shù)的數(shù)據(jù)
<script type="text/javascript">
    function dosomething(res){
        // 處理獲得的數(shù)據(jù)
        console.log(res.data)
    }
</script>

2.Query ajax

$.ajax({
    // 請(qǐng)求域名
    url:'http://10.10.0.101:8899/login',
    // 請(qǐng)求方式
    type:'GET',
    // 數(shù)據(jù)類型選擇 jsonp
    dataType:'jsonp',
    // 回調(diào)方法名
    jsonpCallback:'callback',
});
// 回調(diào)方法
function callback(response) {
console.log(response);
}

3.Vue.js

this.$http.jsonp('http://www.domain2.com:8080/login', {
    params: {},
    jsonp: 'handleCallback'
}).then((res) => {
    console.log(res); 
})

代理服務(wù)器nginx

跨域限制是瀏覽器的同源策略導(dǎo)致的,使用 nginx 當(dāng)做服務(wù)器訪問(wèn)別的服務(wù)的 HTTP 接口是不需要執(zhí)行 JS 腳本就不存在同源策略限制的,所以可以利用 Nginx 創(chuàng)建一個(gè)代理服務(wù)器,這個(gè)代理服務(wù)器的域名跟瀏覽器要訪問(wèn)的域名一致,然后通過(guò)這個(gè)代理服務(wù)器修改 cookie 中的域名為要訪問(wèn)的 HTTP接口的域名,通過(guò)反向代理實(shí)現(xiàn)跨域。

Nginx 的配置信息:

server {
    # 代理服務(wù)器的端口
    listen 88;
    # 代理服務(wù)器的域名
    server_name http://127.0.0.1;
    location / {
        # 反向代理服務(wù)器的域名+端口
        proxy_pass http://127.0.0.2:89;
        # 修改cookie里域名
        proxy_cookie_domain http://127.0.0.2 http://127.0.0.1;
        index index.html index.htm;
        # 設(shè)置當(dāng)前代理服務(wù)器允許瀏覽器跨域
        add_header Access-Control-Allow-Origin http://127.0.0.1;
        # 設(shè)置當(dāng)前代理服務(wù)器允許瀏覽器發(fā)送 cookie
        add_header Access-Control-Allow-Credentials true;
    }
}

前端代碼:

var xhr = new XMLHttpRequest();
// 設(shè)置瀏覽器允許發(fā)送 cookie
xhr.withCredentials = true;
// 訪問(wèn) nginx 代理服務(wù)器
xhr.open('get', 'http://127.0.0.1:88', true);
xhr.send();

到此這篇關(guān)于JavaScript瀏覽器的跨域問(wèn)題解決方案的文章就介紹到這了,更多相關(guān)JS瀏覽器跨域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript模板引擎應(yīng)用場(chǎng)景及實(shí)現(xiàn)原理詳解

    JavaScript模板引擎應(yīng)用場(chǎng)景及實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了JavaScript模板引擎應(yīng)用場(chǎng)景及實(shí)現(xiàn)原理,結(jié)合實(shí)例形式詳細(xì)分析了javascript模版引擎的具體應(yīng)用場(chǎng)景、實(shí)現(xiàn)原理、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • 簡(jiǎn)單的JS控制button顏色隨點(diǎn)擊更改的實(shí)現(xiàn)方法

    簡(jiǎn)單的JS控制button顏色隨點(diǎn)擊更改的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇簡(jiǎn)單的JS控制button顏色隨點(diǎn)擊更改的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 如何用JS實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)監(jiān)聽

    如何用JS實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)監(jiān)聽

    這篇文章主要介紹了如何用JS實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)監(jiān)聽,對(duì)數(shù)據(jù)監(jiān)聽感興趣的同學(xué),可以參考一下
    2021-05-05
  • JavaScript?中的行繼續(xù)符操作

    JavaScript?中的行繼續(xù)符操作

    JavaScript?中的字符串操作可能很復(fù)雜,?盡管字符串操作易于掌握,但實(shí)施起來(lái)卻具有挑戰(zhàn)性,其中一個(gè)相關(guān)領(lǐng)域是添加新行,這篇文章主要介紹了JavaScript中的行繼續(xù)符操作,需要的朋友可以參考下
    2023-06-06
  • JavaScript連接組件實(shí)現(xiàn)打印功能

    JavaScript連接組件實(shí)現(xiàn)打印功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何連接連接抖音打印組件實(shí)現(xiàn)打印小票功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-04-04
  • jsTree使用記錄實(shí)例

    jsTree使用記錄實(shí)例

    本文通過(guò)實(shí)例給大家詳細(xì)介紹了jstree的使用技巧,需要的朋友可以參考下本文
    2016-12-12
  • 淺談window對(duì)象的scrollBy()方法

    淺談window對(duì)象的scrollBy()方法

    本文給大家介紹的是windows對(duì)象中的scrollBy()的定義和使用方法,十分的細(xì)致全面,有需要的小伙伴可以參考下。
    2015-07-07
  • JavaScript 模擬用戶單擊事件

    JavaScript 模擬用戶單擊事件

    單擊一個(gè)按鈕或超鏈接,然后會(huì)出現(xiàn)其他的超鏈接,這時(shí)要讓其中的一個(gè)超鏈接被單擊,以顯示一個(gè)初始頁(yè)面。(公司頁(yè)面使用了frameset)很顯然,之后的超鏈接單擊事件需要通過(guò)JavaScript來(lái)觸發(fā)。
    2009-12-12
  • css樣式標(biāo)簽和js語(yǔ)法屬性區(qū)別

    css樣式標(biāo)簽和js語(yǔ)法屬性區(qū)別

    css樣式標(biāo)簽和js語(yǔ)法屬性區(qū)別。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-11-11
  • javascript基于牛頓迭代法實(shí)現(xiàn)求浮點(diǎn)數(shù)的平方根【遞歸原理】

    javascript基于牛頓迭代法實(shí)現(xiàn)求浮點(diǎn)數(shù)的平方根【遞歸原理】

    這篇文章主要介紹了javascript基于牛頓迭代法實(shí)現(xiàn)求浮點(diǎn)數(shù)的平方根,簡(jiǎn)單說(shuō)明了牛頓迭代法的原理,并結(jié)合實(shí)例分析了javascript基于遞歸的數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

保山市| 巴中市| 太保市| 吉水县| 莒南县| 十堰市| 金华市| 尼木县| 当涂县| 邳州市| 北海市| 集贤县| 花莲市| 鲁甸县| 鲁山县| 波密县| 巍山| 龙海市| 勃利县| 宁都县| 九龙县| 罗定市| 苏尼特左旗| 宾川县| 郧西县| 鄂托克前旗| 大余县| 额济纳旗| 佛坪县| 石渠县| 盈江县| 元江| 平陆县| 青海省| 明溪县| 龙川县| 连南| 涿州市| 阿拉善右旗| 宁远县| 屏东县|