跨域問題的4種解決方案

文章導讀

圖片

前言

??跨域問題指的是在Web開發中,由于瀏覽器的同源策略限制,當一個網頁嘗試訪問與它不同源(協議、域名或端口不同)的資源時,可能會遇到安全限制導致無法正常訪問的問題。這種策略旨在防止惡意網站讀取或修改其他網站的數據,保護用戶信息安全。

這樣說可能有點抽象,下面具體展開說明。

跨域問題演示

??通常情況下,我們主流的開發模式是:前后端分離。當我們從瀏覽器80訪問服務端81應用

圖片

下面我們用一個Web工程,一個后端工程具體簡單演示下。

1、Web工程結構:

圖片

  • application.properties

spring.application.name=springboot-cross-web
server.port=8080
  • index.html 頁面

<!DOCTYPE?html>
<html?lang="en">
<head><meta?charset="UTF-8"><meta?http-equiv="X-UA-Compatible"?content="IE=edge"><meta?name="viewport"?content="width=device-width,?initial-scale=1.0"><title>測試跨域請求頁面</title><script?src="js/jquery-3.5.1.min.js"></script>
</head>
<body>
<div><input?type="button"?onclick="crossSubmit()"?value="跨域測試">
</div>
<script>function?crossSubmit()?{//?發送跨域請求jQuery.ajax({url:?"http://localhost:8081/api/cross",type:?"POST",data:?{"key":?"Cross"},success:?function?(result)?{alert("返回數據:"?+?result.data);}});}
</script>
</body>
</html>

2、后端工程結構:

圖片

  • application.properties

spring.application.name=springboot-cross
server.port=8081
  • 測試應用

@RestController
public?class?CrossAppController?{@RequestMapping("/api/cross")public?HashMap<String,?Object>?crossTest()?{return?new?HashMap<String,?Object>()?{{put("state",?200);put("data",?"success");}};}
}

3、啟動并測試

圖片

瀏覽器報錯產生跨域問題。

為什么產生跨域問題?

一般來講,通常產生跨域問題有以下幾種原因:

  1. 協議不同:如 https和http;

  2. 端口不同

  3. 域名不同

圖片

這就是常說的同源策略的問題。產生跨域問題的根源就是請求不同源。

如何解決跨域問題?

從上邊的問題來看,主要在于瀏覽器保護,對參數?"Access-Control-Allow-Origin"的設置。

主要有下解決方案:

一、使用@CrossOrigin注解

@RestController
@CrossOrigin(origins?=?"*")
public?class?CrossAppController?{@RequestMapping("/api/cross")public?HashMap<String,?Object>?crossTest()?{return?new?HashMap<String,?Object>()?{{put("state",?200);put("data",?"success");}};}
}

演示結果:

圖片

二、使用全局跨域配置

@Configuration
public?class?WebConfig?implements?WebMvcConfigurer?{@Overridepublic?void?addCorsMappings(CorsRegistry?registry)?{registry.addMapping("/api/cross").allowedOrigins("*").allowedMethods("GET",?"POST",?"PUT",?"DELETE").allowedHeaders("*");//.allowCredentials(true);}
}

三、使用CorsFilter跨域

@Component
public?class?CorsFilter?implements?Filter?{@Overridepublic?void?doFilter(ServletRequest?req,?ServletResponse?res,?FilterChain?chain)?throws?IOException,?ServletException?{HttpServletResponse?response?=?(HttpServletResponse)?res;HttpServletRequest?request?=?(HttpServletRequest)?req;//?設置允許的來源response.setHeader("Access-Control-Allow-Origin",?"*");//?處理預檢請求if?("OPTIONS".equalsIgnoreCase(request.getMethod()))?{response.setStatus(HttpServletResponse.SC_OK);}?else?{chain.doFilter(req,?res);}}
}

四、使用Nginx來實現跨域

server?{??listen?80;??server_name?your.domain.com;??location?/?{??#?添加CORS相關的響應頭??add_header?'Access-Control-Allow-Origin'?'*';??add_header?'Access-Control-Allow-Methods'?'GET,?POST,?OPTIONS';??add_header?'Access-Control-Allow-Headers'?'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';??#?對于OPTIONS請求,直接返回204狀態碼??if?($request_method?=?'OPTIONS')?{??return?204;??}??#?其他配置...??#?代理到后端服務或其他配置...??#?proxy_pass?http://your_backend/;??#?其他proxy_...指令...??}??
}

總結

  • 跨域問題指的是在Web開發中,由于瀏覽器的同源策略限制,導致無法正常訪問的問題。

  • 主要原理就是請求參數Access-Control-Allow-Origin

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

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

相關文章

yarn的基本命令和用法

Yarn通過并行安裝、離線模式、確定性安裝以及更好的依賴解析算法&#xff0c;為開發者提供了更快、更穩定、更安全的包管理體驗。它保留了npm的大部分功能&#xff0c;并在此基礎上做了大量優化&#xff0c;下面我們就來詳述Yarn的核心命令和實用技巧。&#x1f4da; 安裝Yarn…

【MySQL精通之路】InnoDB(7)-鎖和事務模型(2)-事務模型

主博客&#xff1a; 【MySQL精通之路】InnoDB(7)-鎖和事務模型-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(7)-鎖和事務模型(1)-鎖-CSDN博客 下一篇&#xff1a; 目錄 1.事務隔離級別 2.1 可重復讀 2.2 讀已提交 2.3 讀取未提交 2.4 序列化讀 2.自動提交、…

訂餐系統總結、

應用層&#xff1a; SpringBoot:快速構建Spring項目&#xff0c;采用“約定大于配置”的思想&#xff0c;簡化Spring項目的配置開發。 SpringMvc&#xff1a;Spring框架的一個模塊&#xff0c;springmvc和spring無需通過中間整合層進行整合&#xff0c;可以無縫集成。 Sprin…

完整的數據可視化方法集

在當前的大數據時代&#xff0c;了解如何可視化數據是UI/UX設計師技能的重要組成部分。如今&#xff0c;幾乎所有的公司都需要良好的數據可視化作為確定業務方向和決策的參考。數據的可視化結果越好&#xff0c;用戶的決策就越科學。 1、什么是數據可視化 數據可視化是將信息…

張量 t-product 積(matlab代碼)

參考文獻&#xff1a;Tensor Robust Principal Component Analysis with a New Tensor Nuclear Norm 首先是文章2.3節中 t-product 的定義&#xff1a; 塊循環矩陣&#xff1a; 參考知乎博主的例子及代碼&#xff1a;&#xff08;t-product與t-QR分解&#xff0c;另一篇傅里葉對…

HTML5 設備訪問及輸入輸出設備交互

目錄 設備訪問輸入設備交互輸出設備交互設備訪問 設備信息訪問 navigator.userAgent:獲取瀏覽器的用戶代理字符串,從中可以解析出設備類型、操作系統、瀏覽器版本等信息。 const userAgent = navigator.userAgent; console.log(userAgent); // 輸出類似 "Mozilla/5.0…

算法(Algorithm)

算法&#xff08;Algorithm&#xff09;是指解題方案的準確而完整的描述&#xff0c;是一系列解決問題的清晰指令&#xff0c;代表著用系統的方法描述解決問題的策略機制。也就是說&#xff0c;算法能夠對一定規范的輸入&#xff0c;在有限時間內獲得所要求的輸出。算法應該具有…

【python004】miniforge可行替代方案實戰總結(最近更新中)

1.熟悉、梳理、總結項目研發實戰中的miniforge日常使用中的問題。隨著版本更新&#xff0c;做了一些變動&#xff0c;如商業化限制&#xff0c;取消一些語法等。 2.歡迎點贊、關注、批評、指正&#xff0c;互三走起來&#xff0c;小手動起來&#xff01;

vue通過for循環生成input框后雙向綁定失效問題

有些時候頁面上有太多的表單元素&#xff0c;一個個的寫太過繁瑣&#xff0c;拿 input 框舉例&#xff0c;眾多的 input 框&#xff0c;無非就是輸入框前的說明和 input 框的 name 屬性不一樣 <el-form :inline"true" :model"formInline" size"mi…

01-05.Vue自定義過濾器

目錄 前言過濾器的概念過濾器的基本使用給過濾器添加多個參數 前言 我們接著上一篇文章01-04.Vue的使用示例&#xff1a;列表功能 來講。 下一篇文章 02-Vue實例的生命周期函數 過濾器的概念 概念&#xff1a;Vue.js 允許我們自定義過濾器&#xff0c;可被用作一些常見的文本…

軟件模塊的耦合

軟件模塊的耦合 耦合是指軟件模塊之間的依賴程度&#xff0c;耦合越低&#xff0c;模塊之間的獨立性越高&#xff0c;軟件的可維護性、可重用性也越高。下面是幾種常見的耦合類型的概念&#xff1a; 數據耦合&#xff08;Data Coupling&#xff09;&#xff1a; 當一個模塊通…

Python ? 使用代碼解決今天中午吃什么的重大生存問題

1. 環境安裝 安裝Python代碼環境參考文檔 2. 代碼塊 import random# 準備一下你想吃的東西 hot ["蘭州拉面", "爆肚面", "黃燜雞", "麻辣香鍋", "米線", "麻食", "羊肉泡饃", "肚絲/羊血湯&qu…

doxygen 1.11.0 使用詳解(九)——包含公式

目錄 Doxygen allows you to put LATEX formulas in the output (this works only for the HTML, LATEX and RTF output. To be able to include formulas (as images) in the HTML and RTF documentation, you will also need to have the following tools installed latex: …

定時監測服務器磁盤是否超過閾值,超過就刪除docker 鏡像

達到指定百分比 刪除鏡像腳本 df -h 查找到 內存占用信息 &#xff0c;得到的 文件系統名稱是 overlay的&#xff0c;Use% 達到70就進行刪除docker 鏡像 #!/bin/bash# 設置磁盤使用閾值 THRESHOLD70# 獲取 overlay 文件系統的磁盤使用百分比 DISK_USAGES$(df -h | grep overl…

利用sentence bert 實現語義向量搜索

目錄 基于pytorch的中文語言模型預訓練:https://github.com/zhusleep/pytorch_chinese_lm_pretrain/tree/master sentence_emb.py search_faiss_robert768.py faiss_index.py gen_vec_save2_faiss.py 基于pytorch的中文語言模型預訓練:https://github.com/zhusleep/pytorch_…

[協議]stm32讀取AHT20程序示例

AHT20溫度傳感器使用程序&#xff1a; 使用i2c讀取溫度傳感器數據很簡單&#xff0c;但市面上有至少兩個手冊&#xff0c;我這個對應的手冊貼出來&#xff1a; main: #include "stm32f10x.h" // Device header #include <stdint.h> #includ…

數智賦能內澇治理,四信城市排水防澇解決方案保障城市安全運行

由強降雨、臺風造成城市低洼處出現大量積水、內澇的情況時有發生&#xff0c;給人們出行帶來了極大不便和安全隱患&#xff0c;甚至危及群眾生命財產安全。 為降低內澇造成的損失&#xff0c;一方面我們要大力加強城市排水基礎設施的建設&#xff1b;另一方面要全面掌握城市內澇…

U-Boot menu菜單分析

文章目錄 前言目標環境背景U-Boot如何自動調起菜單U-Boot添加自定義命令實踐 前言 在某個廠家的開發板中&#xff0c;在進入它的U-Boot后&#xff0c;會自動彈出一個菜單頁面&#xff0c;輸入對應的選項就會執行對應的功能。如SD卡鏡像更新、顯示設置等&#xff1a; 目標 本…

docker命令詳解大全

Docker是一種流行的容器化平臺&#xff0c;用于快速部署應用程序并管理容器的生命周期。以下是一些常用的Docker命令及其用途的概述&#xff1a; docker run&#xff1a;創建一個新容器并運行一個命令。docker ps&#xff1a;列出當前運行的容器。docker stop&#xff1a;停止…

Unity射擊游戲開發教程:(20)增加護盾強度

在本文中,我們將增強護盾,使其在受到超過 1 次攻擊后才會被禁用。 Player 腳本具有 Shield PowerUp 方法,我們需要調整盾牌在被摧毀之前可以承受的數量,因此我們將聲明一個 int 變量來設置盾牌可以承受的擊中數量。