Ajax同源策略及跨域問題

Ajax同源策略及跨域問題

    • 同源策略
    • ajax跨域問題
      • 什么是跨域?
      • 為什么不允許跨域?
      • 跨域解決方案
        • 1、CORS
        • 2、express自帶的中間件cors
        • 3、JSONP
          • 原生JSONP
          • jQuery發送JSONP
        • 4、使用vscode的Live Server插件

同源策略

同源策略(Same-Origin Policy)是一種安全策略,是指:協議域名端口,只有以上三點都一樣的情況下才允許訪問相同的cookie、localStorage和發送Ajax請求,以上一點不同都會出現跨域問題

ajax跨域問題

什么是跨域?

在Ajax發請求時,需要顯示的信息一直顯示不出來,打開控制臺發現出現以下錯誤信息:
Access to XMLHttpRequest at ‘http://localhost:8000/users’ from origin ‘http://127.0.0.1:5500’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
顯示是由于 http://localhost:5500 向另外一個服務器地址 http://127.0.0.1:8000 發送請求的時候,由于協議名稱域名端口中的某一項不一致造成的訪問接口失敗,也就是跨域
跨域是產生于瀏覽器的"同源策略",所謂同源策略是指:協議域名端口,只有以上三點都一樣的情況下才允許訪問相同的cookie、localStorage和發送Ajax請求,以上一點不同都會出現跨域問題

為什么不允許跨域?

瀏覽器跨域限制是出于安全性考慮。同源策略的實施可以防止惡意腳本通過跨域請求獲取用戶的敏感數據。如果瀏覽器允許跨域請求,那么惡意網站就可以偽裝成其他網站,并竊取用戶數據,導致安全風險。如果跨域可以請求的話,很多的服務器都會受到額外的攻擊。禁止跨域是瀏覽器的行為,是瀏覽器為了網站的安全性,進行從當前的服務,訪問其它服務器的地址,瀏覽器認為這是存在風險的,因此默認會組織跨域。

跨域解決方案

1、CORS

CORS :全稱cross origin resource share (跨域資源共享)
工作原理: 服務器在返回響應報文的時候,在響應頭中設置一個允許的header
response.setHeader("Access-Control-Allow-Origin", "*");
其他響應頭:

	//設置響應頭  設置允許跨域response.setHeader("Access-Control-Allow-Origin","*");//任意頭部信息response.setHeader("Access-Control-Allow-Headers","*");//預請求結果緩存response.setHeader("Access-Control-Max-Age","delta-seconds");//跨域請求時是否攜帶驗證信息response.setHeader("Access-Control-Allow-Credentials","true");//設置請求允許的方法response.setHeader("Access-Control-Allow-Methods","*");//暴露頭部信息response.setHeader("Access-Control-Expose-Headers","*");

注意:別打錯了。。。最好復制過去,我就是因為control打多了一個 l 找了半天的錯誤。。。
例:

//1、引入express
const express = require("express");//2、創建應用對象
const app = express();//3、創建路由規則
//request是對請求報文的封裝
//response是對響應報文的封裝
//GET請求
app.get("/server", (request, response) => {//設置響應頭 設置允許跨域response.setHeader("Access-Control-Allow-Origin", "*");//設置響應response.send("HELLO AJAX");
});
//4、監聽端口啟動服務
app.listen(8000, () => {console.log("服務已經啟動,8000端口監聽中");
});

2、express自帶的中間件cors

安裝一個包cors,并配置這個cors即可,它也是express的中間件;
它的作用是自動給每一個response設置默認請求頭
這樣就不用我們自己每一個接口都要設置一次了
安裝命令 npm install cors
在服務端配置:

  var cors = require("cors");app.use(cors());

3、JSONP

有一些標簽天生具有跨域能力,比如:imgscriptlinkiframe
JSONP(JSON with Padding)是一種利用<script>標簽不受同源策略限制的特性進行跨域請求的方法。通過動態創建<script>標簽,將請求的數據作為回調函數的參數返回到頁面中。但是,JSONP只支持GET請求,且存在安全性和可維護性的問題。
script/img 等標簽的src屬性請求時不存在跨域問題的,但是只支持GET請求,因為get請求參數直接在url后面拼接,而post請求參數是放在請求體中

原生JSONP
  • 服務端:
// jsonp.html 檢測用戶名是否存在
app.all('/jsonp-server', (request, response) => {//響應一個數據const data = { exist: 1, msg: '用戶名已存在' };let str = JSON.stringify(data); //對對象進行字符串轉換//設置響應體response.send(`handle(${str})`);
})

實現用戶名校驗(模擬一下請求js代碼的過程,并不是真的校驗),服務端的響應體是一個函數的調用,那么我們就應該有這個函數,所以首先要聲明handle函數,然后創建script標簽,利用其src屬性請求數據。

用戶名:<input type="text" id="username">
<p></p>
<script>const input = document.querySelector('input');const p = document.querySelector('p');//聲明handle函數function handle(data) {input.style.border = '1px solid #f00'; p.innerHTML = data.msg;p.style.color = 'red';}input.addEventListener('blur', function() {//獲取用戶輸入值let username = this.value;//向服務器發送請求,監測用戶名是否存在//1.創建script標簽const script = document.createElement('script');//2.設置標簽的src屬性script.src = 'http://127.0.0.1:8000/jsonp-server';//3.將script插入到文檔中document.body.appendChild(script);})
</script>
jQuery發送JSONP

服務端:

// JQuery-jsonp.html 
app.all('/jquery-jsonp-server', (request, response) => {//響應一個數據const data = { name: 'www', age: 18 };let str = JSON.stringify(data); //對對象進行字符串轉換//接收callback參數let callback = request.query.callback;//返回結果,這個callback就相當于是個函數名,相當于handleresponse.send(`${callback}(${str})`);
})
<button>點擊發送jsonp請求</button>
<div id="result"></div><script>$('button').eq(0).click(function() { //使用jquery發送jsonp請求時url后面要加參數callback=?,固定寫法//Jquery中的getJSON,省去了jsonp中handle函數的定義,靠callback代替$.getJSON('http://127.0.0.1:8000/jquery-jsonp-server?callback=?',function(data){$('#result').html(`名稱:${data.name}<br>年齡:${data.age}`)})})
</script>

4、使用vscode的Live Server插件

最簡單的方法!!!
在擴展里搜索Live Server并下載,直接在需要發送請求的頁面右鍵點擊Open whit Live Server即可
請添加圖片描述
注:若使用Live Server還是不成功,在vscode里打開設置–>Live Server>Settings:Proxy,把enable改為true

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35690.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin入門:程序的邏輯控制——03

一、程序的邏輯控制 程序的執行語句主要分為3種&#xff1a;順序語句、條件語句和循環語句。 二、if條件語句 if表達式在Kotlin中用于根據條件執行不同的代碼塊。它有兩種形式&#xff1a;普通if和帶返回值的if。 普通if語句&#xff1a; 普通的if語句由關鍵字if、一個布爾表達…

電腦合上蓋子無線網絡不會斷開

控制面板\硬件和聲音\電源選項\系統設置 最終選擇不會采取任何操作 選擇不會采取任何操作

前端性能優化之性能優化的指標和工具(chrome devtools、lighthouse、webpagetest)

文章目錄 引言一、為什么要進行web性能優化二、RAIL測量模型1. 什么是RAIL2. 性能測量工具 三、性能測量工具的使用和性能指標以及優化目標1. Chrome DevTools1. 打開調試工具方式和配置2. network下的幾個性能指標1. requests 請求總數2. transferred實際從服務器下載的數據量…

【數據結構與算法】十大經典排序算法-希爾排序

&#x1f31f;個人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知識導航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ?如有問題&#xff0c;歡迎指正&#…

手撕數據結構之棧+例題

目錄 一、棧的概念及結構 二、棧的頭文件及基本框架 三、接口實現 1、對棧的初始化 2、棧的銷毀 3、入棧操作 4、出棧操作 5、判斷棧是否為空 6、返回棧頂元素 7、遍歷棧 四、有效的括號 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 思路&#xff…

靜態網頁和動態網頁區別

1&#xff0c;靜態網頁和動態網頁有何區別 1) 更新和維護 靜態網頁內容一經發布到網站服務器上&#xff0c;無論是否有用戶訪問&#xff0c;這些網頁內容都是保存在網站服務器上的。如果要修改網頁的內容&#xff0c;就必須修改其源文件&#xff0c;然后重新上傳到服務器上。…

k8s-----集群調度

目錄 一&#xff1a;調度約束 二&#xff1a;Pod 啟動創建過程 三&#xff1a;k8s調度過程 1、Predicate 有一系列的常見的算法 2、常見優先級選項 3、指定調度節點 &#xff08;1&#xff09;nodeName指定 &#xff08;2&#xff09;nodeSelector指定 四&#xff1a;親和…

【SA8295P 源碼分析】68 - Android 側用戶層 輸入子系統獲取 /dev/input/event0 節點數據 代碼流程分析

【SA8295P 源碼分析】68 - Android 側用戶層 輸入子系統獲取 /dev/input/event0 節點數據 代碼流程分析 一、EventHub.cpp 監聽 /dev/input/event0 節點流程二、EventHub.cpp 讀取 /dev/input/event0 節點數據流程系列文章匯總見:《【SA8295P 源碼分析】00 - 系列文章鏈接匯總…

C++——繼承

文章目錄 &#x1f99c;1. 什么是繼承&#x1f40a;1.1 概念&#x1f40a;1.2 格式&#x1f40a;1.3 繼承方式 & 訪問限定符 &#x1f426;2. 派生類和基類的賦值問題&#x1f9a9;3. 派生類和基類同名成員問題&#x1f413;4.派生類默認成員函數&#x1f409;4.1 構造函數…

React源碼解析18(1)------ React.createElement 和 jsx

1.React.createElement 我們知道在React17版本之前&#xff0c;我們在項目中是一定需要引入react的。 import React from “react” 即便我們有時候沒有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React項目中&#xff0c;如果我們使用了模板語法JSX&am…

使用OkHttp發送POST請求的幾種方式

使用OkHttp發送POST請求的幾種方式 介紹pom依賴基本的POST請求帶授權的POST請求POST方式發送JSON數據Multipart POST 請求 介紹 本文將介紹 OkHttp 客戶端的基本用法。 主要介紹 OkHttp 3.x 版本中發送Post請求的幾種方式。 pom依賴 <dependency><groupId>com.sq…

單調遞增的數字——力扣738

文章目錄 題目描述解法題目描述 解法 #include<iostream> #include<string>using namespace std;int monotoneIncreasingDigits

【學習】若依源碼(前后端分離版)之 “ 異常處理”

大型紀錄片&#xff1a;學習若依源碼&#xff08;前后端分離版&#xff09;之 “ 異常處理” 前言1、統一返回實體定義2、定義登錄異常定義3、基于ControllerAdvice注解的Controller層的全局異常統一處理4、測試訪問請求結語 前言 通常一個web框架中&#xff0c;有大量需要處理…

中小企業項目管理軟件推薦:選擇適合的工具提升項目效率!

中小企業項目管理軟件有哪些&#xff1f;Zoho Projects是一款好用無廣告的項目管理軟件。當個小創業者是真的不容易&#xff0c;不僅要管理團隊&#xff0c;還要管理團隊項目。很多團隊之前用了好多項目管理的軟件&#xff0c;但是都不太滿意。但是如果你經常參加創業者聚會上&…

常見的路由協議之RIP協議與OSPF協議

目錄 RIP OSPF 洪泛和廣播的區別 路由協議是用于在網絡中確定最佳路徑的一組規則。它們主要用于在路由器之間交換路由信息&#xff0c;以便找到從源到目標的最佳路徑。 常見的路由協議&#xff1a; RIP (Routing Information Protocol)&#xff1a;RIP 是一種基于距離向量算…

Mac os 上的apt-get install 就是brew install

Mac os 上面不支持apt-get install ,但是有個 brew install可以代替。 Homebrew是Mac OS的包管理器&#xff0c;可以方便地安裝各種需要的軟件。 1.1 安裝Homebrew 如果沒有安裝Homebrew&#xff0c;需要在終端輸入以下命令進行安裝&#xff1a; /usr/bin/ruby -e "$(…

使用wxPython和PyMuPDF在Python中顯示PDF目錄的實現

展示如何使用wxPython和PyMuPDF庫在Python中選擇PDF文件并將目錄顯示在列表框中。 簡介&#xff1a; 在本篇教程中&#xff0c;我們將學習如何使用wxPython和PyMuPDF庫在Python中選擇PDF文件&#xff0c;并將其目錄顯示在一個列表框中。這將使用戶能夠方便地瀏覽PDF文檔的目錄…

c#實現設配器模式

下面是一個使用C#實現適配器模式的示例代碼&#xff1a; using System;// 目標接口 public interface ITarget {void Request(); }// 目標類 public class Target : ITarget {public void Request(){Console.WriteLine("目標類的請求");} }// 需要適配的類 public c…

Golang 局部變量、全局變量 聲明

文章目錄 一、局部變量二、全局變量 一、局部變量 四種聲明方式 多變量聲明&#xff1a; package mainimport "fmt"//局部變量聲明 func main() {//方法一: 聲明一個變量和數據類型&#xff0c;不初始化值&#xff1b;默認值為0&#xff1b;var lvA intfmt.Printl…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的區別

個人主頁&#xff1a;金鱗踏雨 個人簡介&#xff1a;大家好&#xff0c;我是金鱗&#xff0c;一個初出茅廬的Java小白 目前狀況&#xff1a;22屆普通本科畢業生&#xff0c;幾經波折了&#xff0c;現在任職于一家國內大型知名日化公司&#xff0c;從事Java開發工作 我的博客&am…