欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端JS經典問題之跨域的解決方案

 更新時間:2024年11月26日 10:31:13   作者:yqcoder  
這篇文章主要介紹了前端JS經典問題之跨域的解決方案,文中主要講了瀏覽器的同源策略、跨域限制以及解決跨域的幾種方法,包括CORS、JSONP和配置代理等,需要的朋友可以參考下

一、概念

1. 瀏覽器的同源策略

瀏覽器為確保資源的安全,而遵循的一種策略。

2. 源

源 = 協議 + 域名 + 端口

3. 同源和非同源

當兩個源只有他們的協議、域名、端口都一致,才是同源,否則是非同源。

4. 同源請求和非同源請求

如果是同源發(fā)出的請求就是同源請求,如果是非同源發(fā)出的請求就是非同源請求。

5. 跨域

[所處源] 與 [目標源] 不一致,就會導致跨域。

二、瀏覽器會對跨域做哪些限制

[源 A] 和 [源 B]是非同源的,則瀏覽器會有以下限制。

1. DOM 訪問限制

[源 A]的腳本不能讀取和操作[源 B]的 DOM

2. Cookie 訪問限制

[源 A]不能訪問[源 B]的 Cookie

3. Ajax 響應數據限制

[源 A]可以給[源 B]發(fā)請求,但無法獲取[源 B]的返回的數據

三、注意點

跨域限制僅存在瀏覽器端,服務端不存在跨域限制

即時跨域了,Ajax 請求也可以正常發(fā)出,但響應數據不會交給開發(fā)者。

<link>、<script>、<img>...這些標簽發(fā)出的請求也可能跨域,只不過瀏覽器對標簽不做嚴格限制,對開發(fā)幾乎無影響。

四、CORS 解決跨域

CORS 即跨源資源共享(Cross-Origin Resource Sharing),CORS 是一種機制,它允許 Web 應用服務器進行跨域訪問控制,使不同源的網站之間能夠安全地共享資源。

在默認情況下,出于安全考慮,瀏覽器會限制從一個源(協議、域名、端口)加載的腳本獲取或操作另一個源的資源。而 CORS 為 Web 應用提供了一種安全的方式來繞過這種同源策略的限制。

使用 CORS 解決跨域是最正統(tǒng)的方式,且要求服務器是"自己人"

1. 簡單請求和復雜請求

簡單請求

請求方式:GET、HEAD、POST

Content-type:text/plain、multipart/form-data、application/x-www-form-urlencoded

請求頭字段符合《CORS 安全規(guī)范》,只要你改了請求頭就變復雜請求了。

復雜請求

不是簡單請求就是復雜請求,復雜請求會自動發(fā)送預檢請求。

2. 解決簡單請求

以 nodeJS 為例,服務器端設置響應頭 Access-Control-Allow-Origin,值為發(fā)送請求的源表示,只要從這個源發(fā)送的請求,都通過。值為 "\*" 表示所有不同源發(fā)來的請求都通過。

app.get("/xxx", (res, req) => {
  res.setHeader("Access-Control-Allow-Origin", "發(fā)送請求源" | "*");
  res.send();
});

3. 解決復雜請求

以 nodeJS 為例,服務器設置響應頭,與請求頭一一對應,使用 cors 插件。

app.use(
  cors({
    origin: "xxx", // 允許源
    methods: ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS"], // 允許方法
    allowedHeaders: ["xxx"], // 允許的自定義頭
    exposedHeaders: ["xxx"], // 要暴露的響應頭
  })
);
app.get("/xxx", (res, req) => {
  res.setHeader("xxx", "xxx");
  res.send();
});

五、JSONP 解決跨域

JSONP 利用<script>標簽可以跨域加載腳本,且不受嚴格模式限制的特性。

1. 基本流程

第一步:創(chuàng)建 script 標簽,將 src 設置為跨域請求的 url。同時準備一個回調函數,這個函數處理返回來的數據。

第二步:服務端接受到請求后,將數據封裝在回調函數中返回

第三步:客戶端回調函數被調用,數據以參數的形式傳入回調函數

2. 例子

服務端代碼

let list = [1, 2, 3];
app.get("/table", (req, res) => {
  const { callback } = req.query;
  res.send(`${callback}(${JSON.stringify(list)})`);
});

客戶端代碼

function test(data) {
  console.log(data);
}
function getTable() {
  const script = document.createElement("script");
  script.onload = () => {
    script.remove();
  };
  script.src = "http://xxx.xx.xx:8080/table?callback=test";
  document.body.appendChild(script);
}

六、配置代理解決跨域

1. 自己配置代理服務器

借助 http-proxy-middleware 配置代理

const { createProxyMiddleware } = require("http-proxy-middleware");
app.use(
  "/api",
  createProxyMiddleware({
    target: "https://www.baidu.com",
    changeOrigin: true,
    pathRewrite: {
      "^/api": "",
    },
  })
);

2. 使用 Nginx 搭建代理服務器

2.1 設置響應頭

server {
    listen 80;
    server_name your_domain.com;
    location /api/ {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        if ($request_method = 'OPTIONS') {
            return 204;
        }
        proxy_pass http://your_backend_server;
    }
}

2.2 反向代理

通過 Nginx 將跨域請求代理到目標服務器,讓瀏覽器認為是同源請求。

server {
    listen 80;
    server_name frontend.com;
    location /api/ {
        proxy_pass http://backend.com;
    }
}

3. 腳手架服務器

比如 vue3 里的配置文件 vite.config.js 可以配置代理的地址

import { defineConfig } from "vite";

// https://vitejs.dev/config/
export default defineConfig(() => {
  return {
    server: {
      host: "127.0.0.1",
      port: 8081,
      strictPort: false,
      open: true,
      proxy: {
        "/dev-api": {
          target: "http://localhost:1112",
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/dev-api/, ""),
        },
      },
    },
  };
});

總結 

到此這篇關于前端JS經典問題之跨域的解決方案的文章就介紹到這了,更多相關前端JS跨域解決方案內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 微信小程序實現簡單秒表設計

    微信小程序實現簡單秒表設計

    這篇文章主要為大家詳細介紹了微信小程序實現簡單秒表設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • webpack打包優(yōu)化的幾個方法總結

    webpack打包優(yōu)化的幾個方法總結

    這篇文章主要介紹了webpack打包優(yōu)化的幾個方法總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 定單管理上 JS表格排序

    定單管理上 JS表格排序

    定單管理上 JS表格排序...
    2006-10-10
  • ES6學習教程之模板字符串詳解

    ES6學習教程之模板字符串詳解

    大家都知道在ES6中引進的一種新型的字符串字面量語法-模板字符串,下面這篇文章主要給大家介紹了關于ES6學習教程之模板字符串的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • lightBox 簡易的全屏透明遮罩解決方法

    lightBox 簡易的全屏透明遮罩解決方法

    現在全屏的半透明遮罩層在web2.0網站應用非常廣泛了,絕大多數遮罩是通過計算頁面大小,然后覆蓋一個與頁面同等大小的層實現,如騰訊qzone, wordpress后臺。
    2010-06-06
  • TypeScript中的混合(Mixin)示例詳解

    TypeScript中的混合(Mixin)示例詳解

    由于TypeScrip中的類不支持多繼承,所以引入了混合(Mixin)的特性,可以間接實現多繼承的效果,這篇文章主要介紹了一文弄懂TypeScript中的混合(Mixin),需要的朋友可以參考下
    2023-09-09
  • JavaScript數組去重的6個方法

    JavaScript數組去重的6個方法

    本篇文章主要介紹了JavaScript數組去重的6個方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • JavaScript 解析讀取XML文檔 實例代碼

    JavaScript 解析讀取XML文檔 實例代碼

    應項目之需求,需用JS操作XML文檔,遂上網查資料,感覺這篇文章還不錯,特轉載到此地,與大家共享!
    2009-07-07
  • js合并兩個數組生成合并后的key:value數組

    js合并兩個數組生成合并后的key:value數組

    這篇文章主要是介紹了js將兩個數組合并為類json方式,需要的朋友可以參考下
    2018-05-05
  • js腳本編寫簡單刷票投票系統(tǒng)

    js腳本編寫簡單刷票投票系統(tǒng)

    這篇文章主要為大家詳細介紹了js腳本編寫簡單刷票投票系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論