精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試必問:什么是跨域問題?如何解決?

開發 前端
跨域問題的本質是瀏覽器為了保證用戶的一種安全攔截機制,想要解決跨域問題,只需要告訴瀏覽器“我是自己人,不要攔我”就行。它的常見實現方式有 5 種:通過注解實現局部跨域、通過配置文件實現全局跨域、通過 CorsFilter 對象實現全局跨域、通過 Response 對象實現局部跨域,通過 ResponseBodyAdvice 實現全局跨域。

跨域問題指的是不同站點之間,使用 ajax 無法相互調用的問題。跨域問題本質是瀏覽器的一種保護機制,它的初衷是為了保證用戶的安全,防止惡意網站竊取數據。但這個保護機制也帶來了新的問題,它的問題是給不同站點之間的正常調用,也帶來的阻礙,那怎么解決這個問題呢?接下來我們一起來看。

1.跨域三種情況

在請求時,如果出現了以下情況中的任意一種,那么它就是跨域請求:

  1. 協議不同,如 http 和 https;
  2. 域名不同;
  3. 端口不同。

也就是說,即使域名相同,如果一個使用的是 http,另一個使用的是 https,那么它們也屬于跨域訪問。常見的跨域問題如下圖所示:

圖片

2.跨域問題演示

接下來,我們使用兩個 Spring Boot 項目來演示跨域的問題,其中一個是端口號為 8080 的前端項目,另一個端口號為 9090 的后端接口項目。

2.1 前端網站

前端項目只需要在 resources 下放兩個文件,一個用于發送 ajax 請求的 jquery.js,另一個是 html 前端頁面,工程目錄如下圖所示:

圖片

其中前端頁面 index.html 的代碼如下:

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

2.2 后端接口

后端接口項目首先先在 application.properties 配置文件中,設置項目的端口號為 9090,如下所示:

server.port=9090

然后創建一個后端控制器,返回一個 JSON 格式的數據,實現代碼如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;

@RestController
public class TestController {
@RequestMapping("/test")
public HashMap<String, Object> test() {
return new HashMap<String, Object>() {{
put("state", 200);
put("data", "success");
put("msg", "");
}};
}
}

以上兩個項目創建并啟動成功之后,使用前端項目訪問后端接口,因為端口不一樣,所以也屬于跨域訪問,運行結果如下圖所示:

圖片

3.解決跨域問題

在 Spring  Boot 中跨域問題有很多種解決方案,比如以下 5 個:

  1. 使用 @CrossOrigin 注解實現跨域;
  2. 通過配置文件實現跨域;
  3. 通過 CorsFilter 對象實現跨域;
  4. 通過 Response 對象實現跨域;
  5. 通過實現 ResponseBodyAdvice 實現跨域。

當然如果你愿意的話,還可以使用過濾器來實現跨域,但它的實現和第 5 種實現類似,所以本文就不贅述了。

3.1 通過注解跨域

使用 @CrossOrigin 注解可以輕松的實現跨域,此注解既可以修飾類,也可以修飾方法。當修飾類時,表示此類中的所有接口都可以跨域;當修飾方法時,表示此方法可以跨域,它的實現如下:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;

@RestController
@CrossOrigin(origins = "*")
public class TestController {
@RequestMapping("/test")
public HashMap<String, Object> test() {
return new HashMap<String, Object>() {{
put("state", 200);
put("data", "success");
put("msg", "");
}};
}
}

以上代碼的執行結果如下圖所示:

圖片

從上圖中可以看出,前端項目訪問另一個后端項目成功了,也就說明它解決了跨域問題。優缺點分析此方式雖然雖然實現(跨域)比較簡單,但細心的朋友也能發現,使用此方式只能實現局部跨域,當一個項目中存在多個類的話,使用此方式就會比較麻煩(需要給所有類上都添加此注解)。

3.2 通過配置文件跨域

接下來我們通過設置配置文件的方式就可以實現全局跨域了,它的實現步驟如下:

  • 創建一個新配置文件;
  • 添加 @Configuration 注解,實現 WebMvcConfigurer 接口;
  • 重寫 addCorsMappings 方法,設置允許跨域的代碼。

具體實現代碼如下:

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 CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 所有接口
.allowCredentials(true) // 是否發送 Cookie
.allowedOriginPatterns("*") // 支持域
.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法
.allowedHeaders("*")
.exposedHeaders("*");
}
}

3.3 通過 CorsFilter 跨域

此實現方式和上一種實現方式類似,它也可以實現全局跨域,它的具體實現代碼如下:

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 {
@Bean
public CorsFilter corsFilter() {
// 1.創建 CORS 配置對象
CorsConfiguration config = new CorsConfiguration();
// 支持域
config.addAllowedOriginPattern("*");
// 是否發送 Cookie
config.setAllowCredentials(true);
// 支持請求方式
config.addAllowedMethod("*");
// 允許的原始請求頭部信息
config.addAllowedHeader("*");
// 暴露的頭部信息
config.addExposedHeader("*");
// 2.添加地址映射
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**", config);
// 3.返回 CorsFilter 對象
return new CorsFilter(corsConfigurationSource);
}
}

3.4 通過 Response 跨域

此方式是解決跨域問題最原始的方式,但它可以支持任意的 Spring Boot 版本(早期的 Spring Boot 版本也是支持的)。但此方式也是局部跨域,它應用的范圍最小,設置的是方法級別的跨域,它的具體實現代碼如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;

@RestController
public class TestController {
@RequestMapping("/test")
public HashMap<String, Object> test(HttpServletResponse response) {
// 設置跨域
response.setHeader("Access-Control-Allow-Origin", "*");
return new HashMap<String, Object>() {{
put("state", 200);
put("data", "success");
put("msg", "");
}};
}
}

3.5 通過 ResponseBodyAdvice 跨域

通過重寫 ResponseBodyAdvice 接口中的 beforeBodyWrite(返回之前重寫)方法,我們可以對所有的接口進行跨域設置,它的具體實現代碼如下:

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
/**
* 內容是否需要重寫(通過此方法可以選擇性部分控制器和方法進行重寫)
* 返回 true 表示重寫
*/
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
/**
* 方法返回之前調用此方法
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
// 設置跨域
response.getHeaders().set("Access-Control-Allow-Origin", "*");
return body;
}
}

此實現方式也是全局跨域,它對整個項目中的所有接口有效。

4.原理分析

為什么通過以上方法設置之后,就可以實現不同項目之間的正常交互呢?這個問題的答案也很簡單,我們之前在說跨域時講到:“跨域問題本質是瀏覽器的行為,它的初衷是為了保證用戶的訪問安全,防止惡意網站竊取數據”,那想要解決跨域問題就變得很簡單了,只需要告訴瀏覽器這是一個安全的請求,“我是自己人”就行了,那怎么告訴瀏覽器這是一個正常的請求呢?只需要在返回頭中設置“Access-Control-Allow-Origin”參數即可解決跨域問題,此參數就是用來表示允許跨域訪問的原始域名的,當設置為“*”時,表示允許所有站點跨域訪問,如下圖所示:

圖片

所以以上 5 種解決跨域問題的本質都是給響應頭中加了一個 Access-Control-Allow-Origin 的響應頭而已。

演示項目源碼

https://gitee.com/mydb/springboot-examples/tree/master/spring-boot-cross

總結

跨域問題的本質是瀏覽器為了保證用戶的一種安全攔截機制,想要解決跨域問題,只需要告訴瀏覽器“我是自己人,不要攔我”就行。它的常見實現方式有 5 種:通過注解實現局部跨域、通過配置文件實現全局跨域、通過 CorsFilter 對象實現全局跨域、通過 Response 對象實現局部跨域,通過 ResponseBodyAdvice 實現全局跨域。

參考 & 鳴謝

blog.csdn.net/pjmike233/article/details/82461911

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2022-09-07 07:05:25

跨域問題安全架構

2021-06-06 13:05:15

前端跨域CORS

2024-10-29 16:41:24

SpringBoot跨域Java

2022-03-11 10:01:47

開發跨域技術

2022-02-22 11:54:05

跨域項目前后端

2023-02-03 07:24:49

雙親委派模型

2023-04-07 10:51:39

2022-10-13 14:11:29

瀏覽器域名端口

2025-07-29 01:20:00

失效InnoDB存儲

2017-08-20 12:49:59

瀏覽器跨域服務器

2024-04-23 08:46:45

消息積壓KafkaMQ

2024-12-27 16:21:15

2020-09-14 06:57:30

緩存穿透雪崩

2012-09-05 11:09:15

SELinux操作系統

2025-01-02 09:48:52

JVMCARD_元素

2021-01-30 19:35:44

HDFS單點Hadoop

2025-04-25 08:25:00

DNS污染網絡攻擊IP地址

2023-12-26 17:07:56

GenAICIO

2022-07-26 09:03:50

冪等性數據狀態機

2023-02-01 07:15:16

點贊
收藏

51CTO技術棧公眾號

欧美亚一区二区| 91豆花视频在线播放| 99riav1国产精品视频| 亚洲国产日韩精品在线| 免费日韩中文字幕| 婷婷免费在线视频| 成人免费看视频| 国产福利视频一区| 在线免费日韩av| 免费成人高清在线视频theav| 欧美日韩午夜在线| 黄色大片中文字幕| 国产三级在线播放| 久久婷婷国产综合国色天香| 亚洲影院在线看| 日本韩国欧美中文字幕| 自拍欧美日韩| 亚洲网站在线观看| 亚洲麻豆一区二区三区| 国产一区精品福利| 欧美日韩国产在线播放| 四虎永久国产精品| 偷拍自拍在线视频| 国产成人午夜视频| 国产精品久久二区| 国产午夜视频在线播放| 久久久久午夜电影| 国产亚洲a∨片在线观看| 丰满岳乱妇一区二区| 国产精品一区二区三区av| 日本道免费精品一区二区三区| 黄色a级在线观看| 国产女人在线视频| 91免费精品国自产拍在线不卡| 92福利视频午夜1000合集在线观看| youjizz在线视频| 亚洲茄子视频| 欧美日韩电影在线观看| 国产麻豆视频在线观看| 成人国产精品一级毛片视频| 日韩精品中文字幕在线播放| 波多野结衣办公室双飞| 亚洲日本视频在线| 777a∨成人精品桃花网| www.这里只有精品| 巨胸喷奶水www久久久| 日韩欧美在线国产| 亚洲欧洲日产国码无码久久99| 国产精品186在线观看在线播放| 亚洲丝袜自拍清纯另类| 亚洲国产日韩综合一区| 91在线不卡| 国产精品网站一区| 亚洲欧美日韩综合一区| 2019中文字幕在线视频| 国产精品嫩草久久久久| 一区二区三区四区免费视频| www.亚洲资源| 国产精品二区一区二区aⅴ污介绍| 日本一区免费在线观看| 国产三级在线| 中文久久乱码一区二区| 一区二区三视频| 精精国产xxxx视频在线| 亚洲精品久久久久久国产精华液| 国产亚洲精品久久久久久久| 免费电影视频在线看| 午夜精品一区二区三区三上悠亚| 浮妇高潮喷白浆视频| 国产高清不卡| 欧美日韩视频在线观看一区二区三区 | 免费精品一区| 欧美va亚洲va| 欧美 变态 另类 人妖| 国产区精品区| www日韩中文字幕在线看| 超碰在线国产97| 136国产福利精品导航网址| 8x拔播拔播x8国产精品| 黄色av一区二区| 狠狠色狠狠色合久久伊人| av成人免费观看| 四虎国产精品永远| 国产精品麻豆久久久| 毛片在线视频观看| 成人欧美大片| 69久久99精品久久久久婷婷| 亚洲欧美日韩偷拍| 欧美日韩性在线观看| 欧美另类第一页| 黄网在线观看视频| 久久亚洲风情| 91一区二区三区| 亚洲 欧美 激情 小说 另类| 欧美激情一区二区三区四区| 黄色一级片国产| 色是在线视频| 91精品欧美福利在线观看| 国产精品麻豆入口| 日韩不卡一区| 91高清在线免费观看| 亚洲一区中文字幕在线| 99久久亚洲一区二区三区青草 | 亚洲自拍偷拍网| 97超碰国产精品女人人人爽| 亚洲视频一区在线播放| jvid福利写真一区二区三区| 一区二区三区四区欧美| 综合久久2023| 欧美成人a∨高清免费观看| a级片在线观看| 激情亚洲网站| 国产裸体写真av一区二区| 午夜激情在线视频| 中文字幕一区二区三区视频| 成人黄色片视频| 亚洲一区二区三区免费| 日韩中文字幕精品| 五月天婷婷导航| aaa亚洲精品一二三区| 中文字幕免费高| 素人啪啪色综合| 精品视频在线导航| 日本中文字幕免费| 国产麻豆精品95视频| 午夜免费电影一区在线观看| 伊人久久视频| 亚洲精品二三区| 国产午夜精品无码一区二区| 韩国av一区二区| 亚洲一二三区在线| 精品123区| 亚洲欧美国产精品专区久久 | 亚洲精品麻豆| av日韩免费电影| 国产三区视频在线观看| 欧美精品成人一区二区三区四区| 国产又黄又粗视频| 久久久精品日韩| 久久亚洲一区二区| 在线能看的av网址| 日韩精品在线影院| 国产精品第5页| 2023国产精品视频| 日批视频在线免费看| 欧美日日夜夜| 欧美在线视频观看| 全部免费毛片在线播放网站| 欧美午夜电影在线| 在线免费观看麻豆| 视频在线观看一区二区三区| 日本10禁啪啪无遮挡免费一区二区| 不卡视频观看| 日韩高清有码在线| 69国产精品视频免费观看| 91亚洲精品乱码久久久久久蜜桃| 黄色国产一级视频| 亚洲图片久久| 国产精品福利观看| 日本激情在线观看| 欧美另类久久久品| h色网站在线观看| 国产a视频精品免费观看| 精品一区二区三区无码视频| 久久久久高潮毛片免费全部播放| 91国在线精品国内播放| 精品乱码一区二区三四区视频| 在线观看日韩电影| www.xx日本| 国产成人av影院| 免费在线观看亚洲视频| 女人丝袜激情亚洲| 国产日韩精品综合网站| 手机电影在线观看| 日韩精品在线免费观看| 又污又黄的网站| 亚洲精品国产精品乱码不99| 亚洲综合自拍网| 日日摸夜夜添夜夜添国产精品| 亚洲日本japanese丝袜| 亚洲精品黑牛一区二区三区| 91av视频在线| 最新国产在线观看| 精品美女一区二区| 国产精品久久久久久久久久精爆| 中文字幕一区在线观看视频| 性活交片大全免费看| 首页综合国产亚洲丝袜| 久久观看最新视频| 亚洲美女久久| 91午夜在线播放| 美女的胸无遮挡在线观看| 日韩中文字幕精品视频| 欧美视频一二区| 在线观看www91| 国产亚洲小视频| 国产欧美一区二区精品久导航 | 国产3p露脸普通话对白| 欧洲grand老妇人| 国产精品免费视频一区二区| 狠狠久久综合| 欧美专区在线播放| 性欧美videos高清hd4k| 亚洲香蕉成人av网站在线观看| 北条麻妃一二三区| 欧美在线免费观看视频| 国产午夜精品一区二区理论影院| 国产精品久久综合| 亚洲国产精品无码久久久久高潮| 久久国产精品72免费观看| 国产毛片视频网站| 伊人情人综合网| 亚洲精美视频| 午夜精品影视国产一区在线麻豆| 国产精品自产拍高潮在线观看| 天堂中文av在线资源库| 欧美精品中文字幕一区| 亚洲欧美天堂在线| 欧美精品日日操| 欧美黄色成人网| 麻豆av免费在线观看| 亚洲欧美国产一本综合首页| 丰满人妻妇伦又伦精品国产| 在线成人小视频| 久久久久久无码精品大片| 亚洲成av人片www| 亚洲成人生活片| 国产精品激情偷乱一区二区∴| 中文字幕成人动漫| 97久久精品人人做人人爽50路| www.欧美com| 国产另类ts人妖一区二区| 欧美午夜aaaaaa免费视频| 久热精品在线| 成人羞羞国产免费网站| 亚洲一区视频| 97免费资源站| 久久99精品久久久野外观看| 91久久久久久久| 国产乱码精品一区二区三区亚洲人 | 在线不卡中文字幕| 91肉色超薄丝袜脚交一区二区| 欧洲视频一区二区| 国产超级av在线| 欧美舌奴丨vk视频| 4388成人网| 天堂中文在线播放| 日本午夜精品理论片a级appf发布| 岛国av免费在线观看| 69国产精品成人在线播放| cao在线视频| 4388成人网| 欧美极度另类| 国产精品三级美女白浆呻吟| 成人亚洲视频| 国产精品午夜一区二区欲梦| 另类一区二区| 亚洲精品欧美一区二区三区| 亚洲日本一区二区三区在线| 3d动漫精品啪啪一区二区三区免费| 天堂久久av| 国产在线一区二区三区欧美| 欧美五码在线| 奇米精品在线| 欧美一级精品片在线看| 伊人久久大香线蕉成人综合网| 91影院成人| 潘金莲一级淫片aaaaa免费看| 68国产成人综合久久精品| 欧美大黑帍在线播放| 亚洲另类黄色| 噼里啪啦国语在线观看免费版高清版| 免费观看久久久4p| 少妇极品熟妇人妻无码| 成人黄色国产精品网站大全在线免费观看| 性色av蜜臀av浪潮av老女人| 精品一区二区三区在线| 免费91麻豆精品国产自产在线观看| 精品美女在线观看视频在线观看 | 亚洲精品一区二区三区精华液| 丰满岳乱妇国产精品一区| 日韩久久免费视频| 午夜在线免费观看视频| 欧美成人午夜激情在线| а√在线天堂官网| 国产精品香蕉国产| 精品欧美午夜寂寞影院| 亚洲激情图片| 亚洲激情午夜| 精品亚洲一区二区三区四区| 大尺度一区二区| 国产精品一二三区在线观看| 亚洲免费在线观看视频| 麻豆久久久久久久久久| 欧美人体做爰大胆视频| 三级网站免费观看| 日韩在线精品视频| 欧美亚洲日本精品| 亚洲伊人第一页| 久久综合欧美| 国产一区二区三区乱码| 秋霞午夜鲁丝一区二区老狼| av免费观看不卡| 一区在线中文字幕| 91美女免费看| 欧美xxxx在线观看| 在线视频91p| 欧美一级高清免费| 亚洲不卡视频| 伊人久久av导航| 日韩一区精品字幕| 国产精品久久久久久久无码| 国产精品久久久久永久免费观看 | 欧美日韩国产综合一区二区三区| 国产综合无码一区二区色蜜蜜| 中文字幕欧美专区| 无码小电影在线观看网站免费 | 国产又粗又长又大的视频| 成人av免费观看| 男人与禽猛交狂配| 欧美日韩国产另类一区| 国产一级网站视频在线| 91国产高清在线| 国产精品毛片视频| 操bbb操bbb| 韩国精品在线观看 | 一区二区三区在线视频观看58 | 欧美mv和日韩mv的网站| 日本高清视频在线播放| 国产精品久久久久久久7电影| 色愁久久久久久| 妞干网在线视频观看| 国产成人精品免费一区二区| 欧美黑吊大战白妞| 91精品国产综合久久精品图片| 伊人免费在线| 国产精品久久久久久久久久99| 亚洲第一论坛sis| 免费在线观看亚洲视频| av在线一区二区三区| 国产主播在线播放| 精品sm在线观看| 咪咪网在线视频| 精品无人区一区二区三区竹菊| 亚洲精品日本| 成人性生活免费看| 午夜久久久久久久久| 日本午夜在线视频| 日韩免费av在线| 欧美熟乱15p| 国产又猛又黄的视频| 中文字幕不卡在线观看| 中文字幕1区2区3区| 中文字幕欧美精品在线| 亚洲一区av| 中文字幕の友人北条麻妃| 国产成人免费视频| 免费观看一级视频| 亚洲精品97久久| 精品3atv在线视频| 亚洲国产欧美日韩| 国产精品一区免费视频| 久久一区二区三| 亚洲精品美女久久久| 欧美三级精品| 亚洲一区精彩视频| 国产成人精品免费在线| 国产黄色片免费看| 中文字幕亚洲无线码在线一区| 亚洲伦理久久| 农民人伦一区二区三区| 久久久亚洲综合| 亚洲综合网av| 久久久久久成人精品| 九九在线高清精品视频| 美女在线视频一区二区| 一区二区三区在线播| 五月婷中文字幕| 国产精品视频在线播放| 午夜久久美女| 真人bbbbbbbbb毛片| 欧美日韩国产中文| 久久久123| 日韩精品久久久| 国产精品白丝jk白祙喷水网站| 国产精品1000| 国产一区二区动漫| 视频一区视频二区欧美| 18岁网站在线观看| 日韩久久一区二区| 五月天婷婷社区| 91精品视频在线| 男女精品网站| 成熟的女同志hd| 亚洲日韩中文字幕| 91欧美日韩在线| 亚欧激情乱码久久久久久久久| 午夜国产精品影院在线观看| 免费在线观看黄色| 精品日本一区二区三区在线观看|