国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

什么是瀏覽器同源策略?如何處理同源策略帶來的跨域問題?

這篇具有很好參考價(jià)值的文章主要介紹了什么是瀏覽器同源策略?如何處理同源策略帶來的跨域問題?。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

什么是瀏覽器同源策略

瀏覽器的同源策略(Same-Origin Policy)是一種安全機(jī)制,用于限制一個(gè)網(wǎng)頁文檔或腳本如何與來自不同源的資源進(jìn)行交互。同源是指兩個(gè) URL 的協(xié)議、主機(jī)和端口號都相同。

同源策略的目的是保護(hù)用戶的隱私和安全。它可以防止惡意網(wǎng)站通過腳本訪問其他網(wǎng)站的敏感信息或進(jìn)行惡意操作。同源策略主要限制以下幾個(gè)方面的交互:

  1. 跨域資源讀?。涸跒g覽器中,一個(gè)網(wǎng)頁只能通過 AJAX、WebSocket 或 Fetch API 等方式來請求同源網(wǎng)站的數(shù)據(jù)。這意味著腳本無法直接讀取來自其他域的數(shù)據(jù),以防止惡意網(wǎng)站獲取用戶的敏感信息。

  2. 跨域資源加載:瀏覽器中的腳本無法直接加載來自其他域的資源,如 JavaScript 文件、CSS 文件或字體文件。這是為了防止惡意腳本篡改其他域的資源或執(zhí)行惡意代碼。

  3. 跨域窗口通信:瀏覽器中的腳本只能與同源窗口進(jìn)行通信,不能直接操作或獲取來自其他域的窗口對象的內(nèi)容。

同源策略通過限制不同源之間的交互,提高了瀏覽器的安全性。然而,有時(shí)需要在不同源之間進(jìn)行數(shù)據(jù)交換,為此引入了一些跨域解決方案,如跨域資源共享(CORS)和跨文檔消息傳遞(PostMessage)。這些解決方案允許在特定條件下進(jìn)行跨域交互,同時(shí)保持了一定的安全性。

如何解決跨域問題

跨域問題是由瀏覽器的同源策略所引起的,它限制了不同源(協(xié)議、域名、端口)之間的資源交互。要解決跨域問題,可以采取以下幾種方法:

  1. JSONP(JSON with Padding):JSONP是一種利用<script>標(biāo)簽不受同源策略限制的特性來實(shí)現(xiàn)跨域請求的方法。通過在請求URL中添加一個(gè)回調(diào)函數(shù)參數(shù),服務(wù)器返回的響應(yīng)將被包裹在該函數(shù)中,從而實(shí)現(xiàn)跨域數(shù)據(jù)的獲取。不過用的少。
    下面是一個(gè)簡單的示例,演示如何使用 JSONP 進(jìn)行跨域數(shù)據(jù)獲取:

假設(shè)網(wǎng)頁位于 http://www.example.com,希望從跨域的服務(wù)器 http://api.example.com 獲取數(shù)據(jù)。

  1. 在客戶端的 HTML 頁面中添加以下代碼:
<!DOCTYPE html>
<html>
<head>
    <title>JSONP Example</title>
    <script>
        function handleResponse(data) {
            console.log(data); // 在控制臺中打印獲取到的數(shù)據(jù)
        }
    </script>
</head>
<body>
    <script src="http://api.example.com/data?callback=handleResponse"></script>
</body>
</html>

在這個(gè)例子中,在頁面中定義了一個(gè)名為 handleResponse 的函數(shù)來處理獲取到的數(shù)據(jù)。然后通過添加 <script> 標(biāo)簽來請求跨域服務(wù)器上的數(shù)據(jù),并在 URL 的查詢參數(shù)中指定回調(diào)函數(shù)的名稱為 handleResponse。

  1. 在跨域服務(wù)器 http://api.example.com 上,根據(jù)請求的 URL 參數(shù)返回相應(yīng)的數(shù)據(jù)。服務(wù)器端代碼可以是以下示例(使用 Node.js 和 Express 框架):
const express = require('express');
const app = express();

app.get('/data', (req, res) => {
    const data = { message: 'Hello, World!' };
    const callbackName = req.query.callback; // 獲取回調(diào)函數(shù)名稱

    // 返回?cái)?shù)據(jù),并將數(shù)據(jù)包裹在回調(diào)函數(shù)中
    res.send(`${callbackName}(${JSON.stringify(data)})`);
});

app.listen(80, () => {
    console.log('Server started');
});

在這個(gè)例子中,當(dāng)客戶端發(fā)起 GET 請求到 /data 路由時(shí),服務(wù)器獲取回調(diào)函數(shù)的名稱,然后將數(shù)據(jù)包裹在回調(diào)函數(shù)中作為響應(yīng)返回給客戶端。

通過這種方式,客戶端就能夠從跨域服務(wù)器上獲取數(shù)據(jù),并在指定的回調(diào)函數(shù)中進(jìn)行處理。
例子僅供參考

  1. CORS(Cross-Origin Resource Sharing):CORS是一種在服務(wù)器端配置的解決方案。通過在響應(yīng)頭中添加特定的跨域策略信息,允許瀏覽器在跨域請求時(shí)獲取和處理來自其他域的數(shù)據(jù)。服務(wù)器需要設(shè)置適當(dāng)?shù)?code>Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等響應(yīng)頭來指定允許的跨域訪問規(guī)則。
    以下是一個(gè)示例,演示如何使用CORS來允許跨域訪問:
    假設(shè)網(wǎng)頁位于 http://www.example.com,希望從跨域的服務(wù)器 http://api.example.com 獲取數(shù)據(jù)。

  2. 在服務(wù)器端配置允許跨域訪問的規(guī)則。具體的配置方式取決于服務(wù)器端的語言和框架。以下示例是使用 Node.js 和 Express 框架來配置CORS。

const express = require('express');
const app = express();

// 配置CORS中間件
app.use(function(req, res, next) {
    // 允許特定域的跨域訪問
    res.header('Access-Control-Allow-Origin', 'http://www.example.com');
    // 允許發(fā)送跨域請求的HTTP方法
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
    // 允許的請求頭
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    // 是否允許發(fā)送Cookie
    res.header('Access-Control-Allow-Credentials', 'true');
    next();
});

// 跨域請求處理
app.get('/data', (req, res) => {
    const data = { message: 'Hello, World!' };
    res.send(data);
});

app.listen(80, () => {
    console.log('Server started');
});

在這個(gè)例子中,使用了 Express 框架,并在服務(wù)器端配置了一個(gè)中間件來處理CORS。在中間件中,我們設(shè)置了允許跨域訪問的源(http://www.example.com)、允許的HTTP方法(GET、POST、PUT、DELETE)、允許的請求頭(Content-Type)和是否允許發(fā)送Cookie。這樣就允許了來自指定域名的跨域訪問。

  1. 在客戶端的 JavaScript 代碼中,可以使用AJAX或Fetch API等方式發(fā)送跨域請求:
fetch('http://api.example.com/data', {
    method: 'GET',
    credentials: 'include' // 發(fā)送包含Cookie的請求
})
    .then(response => response.json())
    .then(data => {
        console.log(data); // 在控制臺中打印獲取到的數(shù)據(jù)
    })
    .catch(error => {
        console.error('Error:', error);
    });

在這個(gè)例子中,使用了Fetch API來發(fā)送GET請求到跨域服務(wù)器的 /data 路由,并通過 credentials: 'include' 選項(xiàng)來發(fā)送包含Cookie的請求。然后通過 response.json() 方法解析響應(yīng)數(shù)據(jù)。

通過這種方式,客戶端就能夠通過CORS允許的方式與跨域服務(wù)器進(jìn)行交互,獲取數(shù)據(jù)并進(jìn)行處理。例子僅供參考

  1. 代理服務(wù)器:可以設(shè)置一個(gè)代理服務(wù)器,將跨域請求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器并將響應(yīng)返回給客戶端??蛻舳讼虼矸?wù)器發(fā)出請求,代理服務(wù)器再將請求發(fā)送到目標(biāo)服務(wù)器,然后將響應(yīng)返回給客戶端。因?yàn)橥床呗灾淮嬖谟跒g覽器中,而代理服務(wù)器是在服務(wù)器端進(jìn)行請求轉(zhuǎn)發(fā),所以不會受到同源策略的限制。

以下是一個(gè)使用代理服務(wù)器解決跨域問題的例子:

假設(shè)我們的前端應(yīng)用運(yùn)行在http://localhost:3000,而我們想要請求的跨域API位于http://api.example.com。

  1. 在后端設(shè)置一個(gè)代理服務(wù)器來轉(zhuǎn)發(fā)請求。以下是一個(gè)使用Node.js和Express框架實(shí)現(xiàn)的例子:
const express = require('express');
const request = require('request');

const app = express();

// 設(shè)置代理路由
app.get('/api/data', (req, res) => {
  const apiUrl = 'http://api.example.com/data'; // 目標(biāo)API的URL

  // 轉(zhuǎn)發(fā)請求到目標(biāo)API
  req.pipe(request(apiUrl)).pipe(res);
});

app.listen(8000, () => {
  console.log('Proxy server started');
});

在上述示例中,創(chuàng)建了一個(gè)代理服務(wù)器,將 /api/data 路由映射到目標(biāo) API 的 URL (http://api.example.com/data)。通過使用 request 模塊將請求從代理服務(wù)器轉(zhuǎn)發(fā)到目標(biāo) API,并將響應(yīng)返回給前端應(yīng)用。

  1. 在前端應(yīng)用中發(fā)起請求。假設(shè)使用 Axios 進(jìn)行網(wǎng)絡(luò)請求,可以將請求發(fā)送到代理服務(wù)器的對應(yīng)路由,如下所示:
import axios from 'axios';

axios.get('http://localhost:8000/api/data')
  .then(response => {
    console.log(response.data); // 在控制臺中打印獲取到的數(shù)據(jù)
  })
  .catch(error => {
    console.error('Error:', error);
  });

在這個(gè)例子中,向代理服務(wù)器的 /api/data 路由發(fā)送 GET 請求,代理服務(wù)器會將該請求轉(zhuǎn)發(fā)到目標(biāo) API (http://api.example.com/data),然后將響應(yīng)返回給前端應(yīng)用。

  1. WebSocket:WebSocket 是一種全雙工通信協(xié)議,它可以在客戶端和服務(wù)器之間建立持久性的連接,實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)傳輸。由于 WebSocket 是在單個(gè) HTTP 連接上運(yùn)行的,而不受同源策略的限制,因此可以解決跨域通信的問題。

  2. 使用反向代理:在服務(wù)器端配置一個(gè)反向代理,將所有的請求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器??蛻舳伺c反向代理進(jìn)行通信,而反向代理與目標(biāo)服務(wù)器之間是同源的,因此不會受到同源策略的限制。

以下是一個(gè)使用反向代理解決跨域問題的例子:

假設(shè)前端應(yīng)用運(yùn)行在 http://localhost:3000,而想要請求的跨域 API 位于 http://api.example.com

  • 在反向代理服務(wù)器上配置代理規(guī)則。可以使用常見的反向代理服務(wù)器,如Nginx或Apache。以下是一個(gè)使用Nginx的示例配置:
server {
    listen 80;
    server_name localhost;

    location /api/ {
        proxy_pass http://api.example.com/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

在上述示例中,配置了一個(gè)Nginx服務(wù)器,監(jiān)聽在80端口,并定義了兩個(gè)代理規(guī)則。/api/ 路徑下的請求將被轉(zhuǎn)發(fā)到目標(biāo) API (http://api.example.com/),而其他所有請求將被轉(zhuǎn)發(fā)到前端應(yīng)用 (http://localhost:3000)。

  • 啟動反向代理服務(wù)器。根據(jù)你的環(huán)境和配置方式,啟動配置好的反向代理服務(wù)器。

  • 在前端應(yīng)用中發(fā)送請求。前端應(yīng)用可以直接發(fā)送請求到反向代理服務(wù)器,而不需要關(guān)心跨域問題。例如,使用Axios發(fā)送請求的示例代碼如下:

import axios from 'axios';

axios.get('/api/data')
  .then(response => {
    console.log(response.data); // 在控制臺中打印獲取到的數(shù)據(jù)
  })
  .catch(error => {
    console.error('Error:', error);
  });

在這個(gè)例子中,將請求發(fā)送到反向代理服務(wù)器的 /api/data 路徑,反向代理服務(wù)器會將該請求轉(zhuǎn)發(fā)到目標(biāo) API (http://api.example.com/),然后將響應(yīng)返回給前端應(yīng)用。

React、Vue項(xiàng)目中如何解決跨域問題

在大型項(xiàng)目中,使用React、Vue或其他框架集成的方式,通常會有不同的方法來解決跨域問題。以下是一些常見的解決方案:

  1. 在React項(xiàng)目中,可以使用http-proxy-middleware等中間件來配置代理。以下是一個(gè)示例:
// setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(
    '/api',
    createProxyMiddleware({
      target: 'http://api.example.com', // 目標(biāo)服務(wù)器的URL
      changeOrigin: true,
      pathRewrite: {
        '^/api': '', // 可選,用于重寫路徑
      },
    })
  );
};

在上述示例中,將所有以/api開頭的請求代理到目標(biāo)服務(wù)器http://api.example.com??梢愿鶕?jù)實(shí)際情況進(jìn)行配置。文章來源地址http://www.zghlxwxcb.cn/news/detail-574286.html

  1. 在Vue項(xiàng)目中,可以在vue.config.js中配置代理。以下是一個(gè)示例:
// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://api.example.com', // 目標(biāo)服務(wù)器的URL
        changeOrigin: true,
        pathRewrite: {
          '^/api': '', // 可選,用于重寫路徑
        },
      },
    },
  },
};

到了這里,關(guān)于什么是瀏覽器同源策略?如何處理同源策略帶來的跨域問題?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 瀏覽器同源策略導(dǎo)致跨域問題 No ‘Access-Control-Allow-Origin‘ header 原因及解決方式--(后端、nginx、前端)

    瀏覽器同源策略導(dǎo)致跨域問題 No ‘Access-Control-Allow-Origin‘ header 原因及解決方式--(后端、nginx、前端)

    目錄 現(xiàn)象 原因 瀏覽器同源策略 導(dǎo)致結(jié)果: 解決方案 跨源資源共享(CORS) 各個(gè)端解決方法: 后端: 方式1:重載WebMvcConfigurer方法 方式2:配置監(jiān)聽CorsFilter 方式3:相關(guān)類上加注解?@CrossOrigin 注意事項(xiàng): Nginx解決: 情況1: 前端解決: 本人身份:后端 今天部署線上環(huán)境前端

    2024年01月23日
    瀏覽(25)
  • Python flask跨域支持(Access-Control-Allow-Origin(CORS)跨域資源共享(訪問控制允許來源:允許指定的來源進(jìn)行跨域請求)瀏覽器同源策略、OPTIONS預(yù)檢請求

    Python flask跨域支持(Access-Control-Allow-Origin(CORS)跨域資源共享(訪問控制允許來源:允許指定的來源進(jìn)行跨域請求)瀏覽器同源策略、OPTIONS預(yù)檢請求

    瀏覽器的同源策略(Same-Origin Policy)限制了跨域請求,如果不進(jìn)行特殊處理,跨域請求將被瀏覽器攔截。 接口支持跨域能夠允許瀏覽器跨域請求不被瀏覽器攔截。 下面是跨域請求的一些影響、優(yōu)點(diǎn)和缺點(diǎn): 優(yōu)點(diǎn) 允許不同域名下的應(yīng)用程序進(jìn)行數(shù)據(jù)交互,提高了系統(tǒng)的靈活性

    2024年02月11日
    瀏覽(17)
  • 瀏覽器不同源的頁面之間如何跨域通信

    瀏覽器不同源的頁面之間如何跨域通信

    現(xiàn)在有2個(gè)項(xiàng)目,頁面路徑不同源。 ToC 的收銀臺項(xiàng)目 類似在PC端京東淘寶,支付最后一步的收銀臺頁面,可以選擇不同支付工具付款。 ToB 的后臺管理項(xiàng)目 可以對收銀臺項(xiàng)目整體做一些配置:樣式,支付工具相關(guān)的等等,配置項(xiàng)很多。 需求 想要在后臺管理項(xiàng)目中增刪配置項(xiàng)

    2024年02月14日
    瀏覽(14)
  • Chrome瀏覽器的跨域設(shè)置

    Chrome瀏覽器的跨域設(shè)置

    做前后端分離的開發(fā)的時(shí)候,出于一些原因往往需要將瀏覽器設(shè)置成支持跨域的模式,而且chrome瀏覽器支持可跨域的設(shè)置,但是新版本的chrome瀏覽器提高了跨域設(shè)置的門檻,原來的方法不再適用了。其實(shí)網(wǎng)上也有很多大神總結(jié)的chrome跨域設(shè)置教程,都是差不多。 下載好谷歌瀏

    2024年02月02日
    瀏覽(297)
  • 同瀏覽器下多窗口進(jìn)行跨源通信、同源通信

    同瀏覽器下多窗口進(jìn)行跨源通信、同源通信

    多頁面通信運(yùn)用到了“發(fā)布訂閱”的設(shè)計(jì)模式,一個(gè)頁面發(fā)布指令,其他頁面進(jìn)行訂閱并進(jìn)行相應(yīng)的行為操作! window.postMessage() window.postMessage() 方法可以安全地實(shí)現(xiàn)跨源通信。通常,對于兩個(gè)不同頁面的腳本,只有當(dāng)執(zhí)行它們的頁面位于具有相同的協(xié)議(通常為 https),端口

    2024年02月08日
    瀏覽(15)
  • 最新版本chrome瀏覽器出現(xiàn)的跨域問題及解決方案

    最新版本chrome瀏覽器出現(xiàn)的跨域問題及解決方案

    最近將chrome瀏覽器更新到了最新版本 ,在個(gè)別網(wǎng)站上出現(xiàn)了跨域訪問問題。 目錄 解決辦法: (1)增加參數(shù)配置代碼 (2)重新打開瀏覽器 在桌面快捷方式中右鍵》屬性》快捷方式中的目標(biāo)后面加入以下參數(shù)配置代碼 注意:其中chrome.exe與--disable之間有一個(gè)空格 然后重新打

    2024年02月06日
    瀏覽(97)
  • chrome瀏覽器跨域設(shè)置(版本號108之后的跨域設(shè)置)

    chrome瀏覽器跨域設(shè)置(版本號108之后的跨域設(shè)置)

    1、首先在chrome瀏覽器安裝目錄下復(fù)制chrome.exe,生成一個(gè)新的命名為chrome-cross.exe 注意:為什么要在目錄下復(fù)制一個(gè)新的?是因?yàn)槿绻窒嗤?,可能會?dǎo)致設(shè)置好的跨域?yàn)g覽器打開后跟原來的chrome.exe是同一個(gè)瀏覽器,設(shè)置的跨域?yàn)g覽器就不是生效了。 2、點(diǎn)擊 chrome-cross.exe

    2024年02月15日
    瀏覽(96)
  • 前端瀏覽器緩存的好處和弊端以及如何處理弊端

    好處: 減少冗余的數(shù)據(jù)傳輸,節(jié)省帶寬。 減輕服務(wù)器的請求壓力,因?yàn)橛芯彺婵梢詼p少向服務(wù)器發(fā)送請求, 資源從緩存中讀取,加快客戶端的訪問速度。因?yàn)闊o需從服務(wù)器請求等待響應(yīng) 缺點(diǎn): 系統(tǒng)更新時(shí),如何刪除瀏覽器的緩存資源,加載最新的頁面。 Service Worker:是一

    2024年02月12日
    瀏覽(22)
  • 如何處理html5新標(biāo)簽的瀏覽器兼容問題?

    處理HTML5新標(biāo)簽的瀏覽器兼容問題,特別是針對較舊的瀏覽器,可以采用以下幾種方法: 使用JavaScript創(chuàng)建元素 : 對于不支持HTML5新標(biāo)簽的瀏覽器,可以使用JavaScript(特別是Document Object Model,DOM)來創(chuàng)建這些元素。例如,可以使用 document.createElement(\\\'article\\\') 來在DOM中創(chuàng)建 art

    2024年01月21日
    瀏覽(25)
  • selenium 網(wǎng)頁自動化-在訪問一個(gè)網(wǎng)頁時(shí)彈出的瀏覽器窗口,我該如何處理?

    selenium 網(wǎng)頁自動化-在訪問一個(gè)網(wǎng)頁時(shí)彈出的瀏覽器窗口,我該如何處理?

    相信大家在使用selenium做網(wǎng)頁自動化時(shí),會遇到如下這樣的一個(gè)場景: 在你使用get訪問某一個(gè)網(wǎng)址時(shí),會在頁面中彈出如上圖所示的彈出框。 首先想到是利用Alert類來處理它。 然而,很不幸,Alert類處理的結(jié)果就是沒有結(jié)果,并不能夠?qū)⑦@個(gè)彈出框關(guān)閉掉。 無法用處理alert的

    2024年02月07日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包