SpringBoot 常用跨域處理方案

1.什么是跨域?

跨域是瀏覽器為了保障安全而遵循的一種規則,是同源策略的一部分。

  • 同源:要求協議、域名、端口三者完全相同。

  • 跨域:只要協議、域名、端口中有任何一個不同,瀏覽器就會判定為跨域請求。

跨域(Cross-Origin)是瀏覽器獨有的安全策略,不存在于安卓、iOS、Node.js、Python、Java 等原生客戶端或服務器端環境中。因為瀏覽器是一個開放的、執行不可信代碼,也就是各個網站的 js 腳本的環境,同源策略是為了保證用戶的信息安全。

所以,如果平時測試接口用的是 postman 發送請求,不需要關心跨域問題,但是如果是前后端聯調就必須處理跨域問題。

2.瀏覽器處理跨域請求的方式

瀏覽器遵循同源策略,不允許頁面獲取跨域請求返回的響應結果。

比如:當前網頁是?http://127.0.0.1:63342,然后向服務器?http://127.0.0.1:8080?發送 GET 請求獲取數據。整個過程分成三步:

  • 瀏覽器發送請求

  • 服務器接收請求,處理業務,返回響應

  • 瀏覽器獲取服務器返回的響應并根據響應渲染頁面

無論是跨域請求還是非跨域請求,瀏覽器都可以發送給服務器,并且接收服務器返回的響應數據。

  • 如果該請求是非跨域請求,則 js 腳本可以訪問響應數據

  • 如果該請求是跨域請求,瀏覽器會攔截響應數據,不讓 js 訪問這些數據

其實瀏覽器可以向不同的域名發送請求,但是瀏覽器會攔截響應內容,不讓 js 訪問,無論請求是否成功。

3.跨域處理方案

跨域處理的核心:讓瀏覽器不要攔截跨域請求返回的數據。

服務器的響應中如果有 Access-Control-Allow-Origin: * 這個響應頭,就是告訴瀏覽器:"我是服務器,雖然我跟這個網頁不是同源的,但是我允許這個網頁跟我通信,我們之間的通信是安全的",瀏覽器就不會攔截 js 對響應數據的訪問。

瀏覽器發送的請求可以分為簡單請求和復雜請求:

  • 如果是簡單請求,則瀏覽器直接發送。

  • 如果是復雜請求,則瀏覽器先發送一個預檢請求,即 OPTIONS 請求,問一句:"我可以發送一個超級復雜的跨域請求嗎?",服務器需要返回針對 OPTIONS 的響應。如果服務器允許發送這個復雜請求,瀏覽器才會真正發送請求。

常見的跨域處理方案有:代理服務器、后端服務器跨域配置。

3.1代理服務器

瀏覽器將請求發送到跟頁面同源的代理服務器,代理服務器再將請求轉發到目標服務器。因為服務器間通信不受同源策略限制。比如常見的用 nginx 作為代理服務器。

請求處理過程:

  • 前端發送請求,請求經過 nginx,請求被轉發到后端服務器。

  • 服務器返回原始響應,原始響應經過 nginx,nginx 自動添加 Access-Control-Allow-Origin: * 響應頭,響應返回給前端,js 可以訪問響應數據。

# nginx.conf
server {listen 63342;# 前端頁面的域名或ipserver_name 127.0.0.1;# 代理所有以 /api/ 開頭的請求到后端服務器location /api/ {# 后端服務器地址proxy_pass http://127.0.0.1:8080/; # 修改請求頭,確保后端能收到正確的原始主機信息proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;# 添加CORS響應頭,允許所有來源的請求,生產環境應關閉add_header 'Access-Control-Allow-Origin' '*'; # 允許的請求方法add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH';if ($request_method = 'OPTIONS') {# 對于OPTIONS請求,直接返回204狀態碼,不需要轉發到后端return 204;}}
}

3.2 后端跨域配置

3.2.1 配置 CORS

配置全局 CORS 規則,在所有響應頭都配置可以跨域訪問。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允許所有接口跨域.allowCredentials(true) // 允許瀏覽器在跨域請求中發送認證信息.allowedOriginPatterns("*") // 允許訪問資源的源(協議、域名、端口).allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允許的方法.allowedHeaders("*") // 允許的請求頭.exposedHeaders("*"); // 哪些響應頭可以暴露給前端js}
}

3.2.2 提供 CorsFilter

提供一個 CorsFilter 的 Bean 作為過濾器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;@Configuration
public class MyCorsFilter {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOriginPattern("*"); // 放行所有域名,生產環境請對此進行修改config.setAllowCredentials(true); // 是否發送cookieconfig.addAllowedMethod("*");  // 放行的請求方式config.addAllowedHeader("*"); // 放行的請求頭config.addExposedHeader("*"); // 暴露頭部信息// UrlBasedCorsConfigurationSource: 可以為不同的URL路徑設置不同的CORS規則UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();// 所有的URL路徑都使用同一個CORS規則corsConfigurationSource.registerCorsConfiguration("/**", config);return new CorsFilter(corsConfigurationSource);}
}

3.2.3 @CrossOrigin 注解

在接口類上或者接口方法上添加 @CrossOrigin 注解,表示整個類、單個接口的響應不會被攔截。

@RestController
@CrossOrigin
public class DemoController {@PutMapping("/put")public Integer put(MultipartFile file) {System.out.println(file.getOriginalFilename());return 200;}@GetMapping("/get")public Integer get() {return 200;}
}

文章轉載自:ningqw

原文鏈接:SpringBoot 常用跨域處理方案 - ningqw - 博客園

體驗地址:JNPF快速開發平臺

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

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

相關文章

Springboot框架的“上海迪士尼”旅游管理網站設計與開發(代碼+數據庫+LW)

摘 要 隨著旅游行業的不斷發展,特別是主題公園的快速增長,如何通過現代信息技術提升旅游服務質量與管理效率成為了行業的重要課題。上海迪士尼作為中國乃至全球知名的主題公園,其旅游管理網站的設計與開發,不只需要滿足游客對信…

后臺管理系統-16-vue3之動態路由的實現

文章目錄 1 動態路由 1.1 stores/index.js(動態添加路由函數) 1.1.1 獲取菜單數據 1.1.2 動態導入組件 1.1.3 處理菜單項 1.1.4 添加路由 1.1.5 整體代碼 1.2 router/index.js(移除子路由) 1.3 Login.vue(登錄頁面) 2 多賬號bug問題 2.1 問題復現 2.2 解決多賬號路由問題(store…

社群團購平臺與定制開發開源AI智能名片S2B2C商城小程序的融合創新研究

摘要:本文聚焦于社群團購平臺這一在移動互聯網背景下興起的電子商務運營機構,深入剖析其依托移動互聯網滿足消費者多元購物需求的特點。同時,引入定制開發開源AI智能名片S2B2C商城小程序這一關鍵元素,探討二者融合所帶來的創新模式…

模型交互中的會話狀態管理實踐

模型交互中的會話狀態管理實踐 目錄 引言會話狀態的手動管理構建多輪對話消息序列追加歷史響應實現上下文共享API支持的自動會話狀態管理利用 previous_response_id 實現線程式對話模型響應數據保存與計費說明上下文窗口管理與令牌限制令牌計算與窗口溢出風險令牌工具輔助統計…

基于Java+Springboot的船舶運維系統

源碼編號:sy23源碼名稱:基于Springboot的船舶運維系統用戶類型:多角色,船員、維修人員、管理員數據庫表數量:9 張表主要技術:Java、Vue、ElementUl 、SpringBoot、Maven運行環境:Windows/Mac、J…

零基礎也能照做的WordPress網站安全漏洞修復 + 高級優化保姆級教程。

建議先在**暫存環境(Staging)**演練后再動正式站,避免線上故障。下面第一部分就教你“備份暫存還原演練”。 總覽導航(按順序完成) 備份與還原演練(UpdraftPlus 寶塔/阿里/騰訊/七牛)高危加固…

HI3516DV500/HI3519DV500 Docker開發環境配置

目錄一、拉取Ubuntu 18.04 docker鏡像二、查看已有鏡像三、基于鏡像創建容器1. 創建容器2. 退出容器3. 查看容器4. 啟動容器5. 進入容器6. 更新容器內部軟件源四、安裝CANN包1. 安裝基礎依賴環境2. 安裝并配置python 3.7.5配置環境變量安裝vim添加使環境變量生效檢查python版本…

實體店轉型破局之道:新零售社區商城小程序開發重構經營生態

在數字化浪潮的席卷下,實體店經營正經歷著前所未有的變革與挑戰。客戶進店率持續走低、同行競爭白熱化、經營成本不斷攀升、電商平臺沖擊加劇……這些痛點如同達摩克利斯之劍,懸在傳統實體商家的頭頂。然而,危機往往與機遇并存,新…

前端-如何將前端頁面輸出為PDF并打包的壓縮包中

需要引入的依賴:import * as utils from ../../utils/utils import html2canvas from "html2canvas"; import JSZip from "jszip"; import JSPDF from "jspdf"; import FileSaver from "file-saver"import { Loading } fro…

LabVIEW 頻譜分析應用

LabVIEW 頻譜分析程序廣泛應用于聲學、振動、電力電子等領域,用于噪聲頻譜分析、設備故障診斷、電能質量評估等。通過模塊化 VI 組合,可快速搭建 "信號模擬 - 采集(或緩存)- 頻譜分析 - 結果展示" 完整流程,…

北斗導航 | 基于MCMC粒子濾波的接收機自主完好性監測(RAIM)算法(附matlab代碼)

詳細闡述基于MCMC粒子濾波的接收機自主完好性監測(RAIM)算法的原理、理論和實現方法,并提供完整的MATLAB代碼示例。 1. 原理與理論 1.1 接收機自主完好性監測 (RAIM) 簡介 RAIM是一種完全由GPS接收機內部實現的算法,用于在不依賴外部系統的情況下,監測GPS信號的完好性(…

【機器學習】4 Gaussian models

本章目錄 4 Gaussian models 97 4.1 Introduction 97 4.1.1 Notation 97 4.1.2 Basics 97 4.1.3 MLE for an MVN 99 4.1.4 Maximum entropy derivation of the Gaussian * 101 4.2 Gaussian discriminant analysis 101 4.2.1 Quadratic discriminant analysis (QDA) 102 4.2.2…

Ruoyi-Vue 靜態資源權限鑒權:非登錄不可訪問

一. 背景 移除/profile下靜態資源訪問權限后,富文本等組件中的圖片加載失敗!!! 使用ruoyi-vue3.8.9過程中發現上傳的在ruoyi.profile下的文件未登錄直接使用鏈接就可以訪問下載,感覺這樣不太安全,所以想對其進行鑒權限制,修改為只…

關于窗口關閉釋放內存,主窗口下的子窗口關閉釋放不用等到主窗口關閉>setAttribute(Qt::WA_DeleteOnClose);而且無需手動釋放

?QWidget重寫closeEvent后,點擊關閉時釋放內存會調用析構函數?,但需注意內存釋放的時機和方式。 關閉事件與析構函數的關系 重寫closeEvent時,若在事件處理中調用deleteLater()或手動刪除對象,析構函數會被觸發。但需注意&#…

C# 簡單工廠模式(構建簡單工廠)

構建簡單工廠 現在很容易給出簡單工廠類。只檢測逗號是否存在,然后返回其中的一個類的實例。 public class NameFactory {public NameFactory(){}public Namer getName(string name){int iname.IndexOf(",");if(i>0)return new LastFirst(name);else{r…

uniappx與uniapp的區別

uniappx與uniapp的定位差異uniappx是DCloud推出的擴展版框架,基于uniapp進行功能增強,主要面向需要更復雜原生交互或跨平臺深度定制的場景。uniapp則是標準版,適用于常規的跨平臺應用開發,強調開發效率和代碼復用。功能擴展性unia…

vue實現拖拉拽效果,類似于禪道首頁可拖拽排布展示內容(插件-Grid Layout)

vue實現拖拉拽效果(插件-Grid Layout) 這個是類似與禪道那種首頁有多個指標模塊,允許用戶自己拼裝內容的那種感覺。 實現效果 插件資料 vue3版本 如果項目是vue3 的話使用的是 Grid Layout Plus。 官網:https://grid-layout-pl…

在Excel和WPS表格中打印時加上行號和列標

在電腦中查看excel和WPS表格的工作表時,能看到行號(12345.....)和列標(ABCDE...),但是打印出來以后默認是沒有行號和列標的,如果要讓打印(或者轉為PDF)出來以后仍能看到行…

設計模式:原型模式(Prototype Pattern)

文章目錄一、原型模式的概念二、原型模式的結構三、原型注冊機制四、完整示例代碼一、原型模式的概念 原型模式是一種創建型設計模式, 使你能夠復制已有對象, 而又無需使代碼依賴它們所屬的類。通過復制(克隆)已有的實例來創建新的…

Linux系統網絡管理

一、網絡參數配置1、圖形化配置#開啟 [rootlocalhost ~]# systemctl start NetworkManager #關閉 [rootlocalhost ~]# systemctl stop NetworkManager #關閉并開機不自啟 [rootlocalhost ~]# systemctl disable --now NetworkManager #開啟并開機自啟 [rootlocalhost ~]# syste…