一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot實現(xiàn)跨域的5種方式

jf_ro2CN3Fa ? 來源:CSDN ? 2023-04-27 10:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、為什么會出現(xiàn)跨域問題

出于瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響??梢哉fWeb是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同源策略的一種實現(xiàn)。

同源策略會阻止一個域的javascript腳本和另外一個域的內(nèi)容進(jìn)行交互。所謂同源(即指在同一個域)就是兩個頁面具有相同的協(xié)議(protocol),主機(jī)(host)和端口號(port)

二、什么是跨域

當(dāng)一個請求url的協(xié)議、域名、端口三者之間任意一個與當(dāng)前頁面url不同即為跨域

90c3d012-e41d-11ed-ab56-dac502259ad0.png

三、非同源限制

無法讀取非同源網(wǎng)頁的 Cookie、LocalStorage 和 IndexedDB

無法接觸非同源網(wǎng)頁的 DOM

無法向非同源地址發(fā)送 AJAX 請求

四、java 后端 實現(xiàn) CORS 跨域請求的方式

對于 CORS的跨域請求,主要有以下幾種方式可供選擇:

返回新的CorsFilter

重寫 WebMvcConfigurer

使用注解 @CrossOrigin

手動設(shè)置響應(yīng)頭 (HttpServletResponse)

自定 web filter 實現(xiàn)跨域

注意:

CorFilter / WebMvConfigurer / @CrossOrigin 需要 SpringMVC 4.2以上版本才支持,對應(yīng)springBoot 1.3版本以上

上面前兩種方式屬于全局 CORS 配置,后兩種屬于局部 CORS配置。如果使用了局部跨域是會覆蓋全局跨域的規(guī)則,所以可以通過 @CrossOrigin 注解來進(jìn)行細(xì)粒度更高的跨域資源控制。

其實無論哪種方案,最終目的都是修改響應(yīng)頭,向響應(yīng)頭中添加瀏覽器所要求的數(shù)據(jù),進(jìn)而實現(xiàn)跨域

1.返回新的 CorsFilter(全局跨域)

在任意配置類,返回一個 新的 CorsFIlter Bean ,并添加映射路徑和具體的CORS配置路徑。

@Configuration
publicclassGlobalCorsConfig{
@Bean
publicCorsFiltercorsFilter(){
//1.添加CORS配置信息
CorsConfigurationconfig=newCorsConfiguration();
//放行哪些原始域
config.addAllowedOrigin("*");
//是否發(fā)送Cookie
config.setAllowCredentials(true);
//放行哪些請求方式
config.addAllowedMethod("*");
//放行哪些原始請求頭部信息
config.addAllowedHeader("*");
//暴露哪些頭部信息
config.addExposedHeader("*");
//2.添加映射路徑
UrlBasedCorsConfigurationSourcecorsConfigurationSource=newUrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**",config);
//3.返回新的CorsFilter
returnnewCorsFilter(corsConfigurationSource);
}
}

2. 重寫 WebMvcConfigurer(全局跨域)

@Configuration
publicclassCorsConfigimplementsWebMvcConfigurer{
@Override
publicvoidaddCorsMappings(CorsRegistryregistry){
registry.addMapping("/**")
//是否發(fā)送Cookie
.allowCredentials(true)
//放行哪些原始域
.allowedOrigins("*")
.allowedMethods(newString[]{"GET","POST","PUT","DELETE"})
.allowedHeaders("*")
.exposedHeaders("*");
}
}

3. 使用注解 (局部跨域)

控制器(類上)上使用注解 @CrossOrigin:,表示該類的所有方法允許跨域。

@RestController
@CrossOrigin(origins="*")
publicclassHelloController{
@RequestMapping("/hello")
publicStringhello(){
return"helloworld";
}
}

在方法上使用注解 @CrossOrigin:

@RequestMapping("/hello")
@CrossOrigin(origins="*")
//@CrossOrigin(value="http://localhost:8081")//指定具體ip允許跨域
publicStringhello(){
return"helloworld";
}

4. 手動設(shè)置響應(yīng)頭(局部跨域)

使用 HttpServletResponse 對象添加響應(yīng)頭(Access-Control-Allow-Origin)來授權(quán)原始域,這里 Origin的值也可以設(shè)置為 “*”,表示全部放行。

@RequestMapping("/index")
publicStringindex(HttpServletResponseresponse){
response.addHeader("Access-Allow-Control-Origin","*");
return"index";
}

5. 使用自定義filter實現(xiàn)跨域

首先編寫一個過濾器,可以起名字為MyCorsFilter.java

packagecom.mesnac.aop;

importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletResponse;
importorg.springframework.stereotype.Component;
@Component
publicclassMyCorsFilterimplementsFilter{
publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{
HttpServletResponseresponse=(HttpServletResponse)res;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age","3600");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
chain.doFilter(req,res);
}
publicvoidinit(FilterConfigfilterConfig){}
publicvoiddestroy(){}
}

在web.xml中配置這個過濾器,使其生效

 

CorsFilter
com.mesnac.aop.MyCorsFilter


CorsFilter
/*

 




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17096

    瀏覽量

    184166
  • JAVA語言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20692
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    439

    瀏覽量

    20377
  • CORS
    +關(guān)注

    關(guān)注

    1

    文章

    7

    瀏覽量

    9045

原文標(biāo)題:Spring Boot 實現(xiàn)跨域的 5 種方式,總有一種適合你,建議收藏

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    多位寬數(shù)據(jù)通過握手方式時鐘

    對于多位寬數(shù)據(jù),我們可以采用握手方式實現(xiàn)時鐘操作。該方式可直接使用xpm_cdc_handshake
    的頭像 發(fā)表于 05-06 09:22 ?1570次閱讀
    多位寬數(shù)據(jù)通過握手<b class='flag-5'>方式</b><b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>

    Spring Boot如何實現(xiàn)異步任務(wù)

    Spring Boot 提供了多種方式實現(xiàn)異步任務(wù),這里介紹三主要實現(xiàn)
    的頭像 發(fā)表于 09-30 10:32 ?1741次閱讀

    Spring Boot連接數(shù)據(jù)庫的三方式

    Spring Boot——三方式連接數(shù)據(jù)庫
    發(fā)表于 04-20 07:58

    啟動Spring Boot項目應(yīng)用的三方法

    首先大家了解什么是Spring Boot?Spring Boot是由Pivotal團(tuán)隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用
    發(fā)表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    ,不需要配置任何特殊的XML配置,為了這個目標(biāo),Spring BootSpring 4.0框架之上提供了很多特性,幫助應(yīng)用以“約定優(yōu)于配置”“開箱即用”的方式來啟動應(yīng)用并運(yùn)行上下文。
    發(fā)表于 12-16 07:57

    Spring Boot從零入門1 詳述

    在開始學(xué)習(xí)Spring Boot之前,我之前從未接觸過Spring相關(guān)的項目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?851次閱讀

    Spring認(rèn)證」什么是Spring GraphQL?

    這個項目建立在 Boot 2.x 上,但它應(yīng)該與最新的 Boot2.4.x5 相關(guān)。 要創(chuàng)建項目,請轉(zhuǎn)到start.spring.io并為要使用的GraphQL傳輸選擇啟動器: 啟動機(jī) 運(yùn)輸 執(zhí)行
    的頭像 發(fā)表于 08-10 14:08 ?1026次閱讀
    「<b class='flag-5'>Spring</b>認(rèn)證」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring Boot特有的實踐

    Spring Boot是最流行的用于開發(fā)微服務(wù)的Java框架。在本文中,我將與你分享自2016年以來我在專業(yè)開發(fā)中使用Spring Boot所采用的最佳實踐。這些內(nèi)容是基于我的個人經(jīng)驗
    的頭像 發(fā)表于 09-29 10:24 ?1164次閱讀

    Spring Boot Web相關(guān)的基礎(chǔ)知識

    Boot的第一個接口。接下來將會將會介紹使用Spring Boot開發(fā)Web應(yīng)用的相關(guān)內(nèi)容,其主要包括使用spring-boot-starter-web組件來
    的頭像 發(fā)表于 03-17 15:03 ?885次閱讀

    Spring Boot中整合兩定時任務(wù)的方法

    框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具備這兩個 Spring 中的定時任務(wù)實現(xiàn)
    的頭像 發(fā)表于 04-07 14:55 ?1827次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>中整合兩<b class='flag-5'>種</b>定時任務(wù)的方法

    Spring Boot如何優(yōu)雅實現(xiàn)數(shù)據(jù)加密存儲、模糊匹配和脫敏

    近來我們都在圍繞著使用Spring Boot開發(fā)業(yè)務(wù)系統(tǒng)時如何保證數(shù)據(jù)安全性這個主題展開總結(jié),當(dāng)下大部分的B/S架構(gòu)的系統(tǒng)也都是基于Spring Boot + SpringMVC三層架
    的頭像 發(fā)表于 06-19 14:42 ?2524次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>如何優(yōu)雅<b class='flag-5'>實現(xiàn)</b>數(shù)據(jù)加密存儲、模糊匹配和脫敏

    Spring Boot Actuator快速入門

    不知道大家在寫 Spring Boot 項目的過程中,使用過 Spring Boot Actuator 嗎?知道 Spring
    的頭像 發(fā)表于 10-09 17:11 ?899次閱讀

    Spring Boot啟動 Eureka流程

    在上篇中已經(jīng)說過了 Eureka-Server 本質(zhì)上是一個 web 應(yīng)用的項目,今天就來看看 Spring Boot 是怎么啟動 Eureka 的。 Spring Boot 啟動 E
    的頭像 發(fā)表于 10-10 11:40 ?1181次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot的啟動原理

    可能很多初學(xué)者會比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴打包成一個獨立的 Jar 包,因為傳統(tǒng)的 Java 項目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?925次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot 的設(shè)計目標(biāo)

    ,這樣我們就可以盡快的上手。 使用 Spring Boot 來不僅可以創(chuàng)建基于 war 方式部署的傳統(tǒng)Java應(yīng)用程序,也可以通過創(chuàng)建獨立的不依賴任何容器(如 tomcat 等)
    的頭像 發(fā)表于 10-13 14:56 ?791次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計目標(biāo)