最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot項目中解決跨域問題的四種方式總結

 更新時間:2025年02月13日 10:26:10   作者:額?無語  
這篇文章主要介紹了瀏覽器同源策略限制導致的跨域問題,并詳細記錄了常見的跨域解決方案,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

開發(fā)項目的時候因為瀏覽器同源策略的限制,經(jīng)常會遇到跨域問題,本篇文章對常見的跨域解決方案做一個記錄。

一,跨域產(chǎn)生的原因

之所以產(chǎn)生跨域主要是因為瀏覽器同源策略的限制。

同源策略,它是由NetSpace提出的一個著名的安全策略。

當一個瀏覽器的兩個tab頁中分別打開來自百度和谷歌的頁面,當瀏覽器的百度tab頁執(zhí)行一個腳本的時候會檢查這個腳本是屬于哪個頁面的,即檢查是否同源,只有和百度同源的腳本才會被執(zhí)行。如果非同源,那么在請求數(shù)據(jù)時,瀏覽器會在控制臺中報一個異常,提示拒絕訪問。

二,什么情況下算跨域

一個域名地址由以下幾個部分組成:

http://www.aaa.com:8080/sie=UTF-8&wd=SpringBoot

  • 協(xié)議:http
  • 域名:子域名www,主域名aaa.com
  • 端口:8080

從一個域名的網(wǎng)頁去請求另一個域名的資源時,協(xié)議,域名,端口任意不同,都會出現(xiàn)跨域問題。

http://www.aaa.com:8080——>http://www.aaa.com:8080:同域訪問
http://www.aaa.com:8080——>http://www.bbb.com:8080:跨域訪問

尤其是在前后端分離的開發(fā)模式下,跨域請求是避免不了的。

三,實際演示

下面我們以一個實際功能為例:用戶輸入用戶名密碼,發(fā)往服務端驗證。

因為瀏覽器同源策略的限制,在瀏覽器控制臺提示我們:

Access to XMLHttpRequest at ‘http://192.168.1.10:7080/tick-tack/login’ from origin ‘http://192.168.1.10:7060’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

我們還可以在Network里看到,瀏覽器在發(fā)送我們輸入的用戶名,密碼等數(shù)據(jù)之前,還發(fā)送了一次OPTIONS的請求,這是瀏覽器自動發(fā)送的,為了驗證是否允許跨域訪問。

四,解決跨域的方法

我們已經(jīng)知道,瀏覽器在發(fā)送請求之前會先發(fā)送一個OPTIONS請求,來校驗是否允許跨域訪問,校驗的結果存放在頭信息的Access-Control-Allow-Origin,因此解決跨域也就是設置頭部信息。有四種方法解決跨域。

1,@CrossOrigin注解

我們可以在特定的某些接口加上@CrossOrigin注解,表示該接口允許跨域訪問。注:未加該注解的接口仍不允許跨域訪問

@PostMapping("/login")
@CrossOrigin
public Result loginSystem(@RequestBody LoginUser user) {
    if (StringUtils.isBlank(user.getUserAccount()) || StringUtils.isBlank(user.getPassword())) {
        return Result.error(Constants.CODE_400, "參數(shù)錯誤");
    }

    TickToken tickToken = ILoginService.loginSystem(user);

    return Result.success(tickToken);
}

@CrossOrigin注解中的origins還可設置域名,表示只有該域名訪問時允許跨域,如:@CrossOrigin(origins =“http://localhost:7060”);
若origins未設置值,表示所有域名都可以跨域訪問該接口

2,添加全局過濾器

若項目中所有接口都允許跨域訪問,可增加全局過濾器允許跨域訪問。

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 CorsConfig {
    // 當前跨域請求最大有效時長。這里默認1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 設置訪問源地址,或者http://localhost:7060
        corsConfiguration.addAllowedHeader("*"); // 2 設置訪問源請求頭
        corsConfiguration.addAllowedMethod("*"); // 3 設置訪問源請求方法,或設置為"GET", "POST", "DELETE", "PUT"
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 對接口配置跨域設置
        return new CorsFilter(source);
    }
}

3,實現(xiàn)WebMvcConfigurer

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 WebConfig implements WebMvcConfigurer {
    // 當前跨域請求最大有效時長。這里默認1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .maxAge(MAX_AGE);
    }
}

4,Nginx解決跨域

如果項目中有使用Nginx來轉發(fā)請求,那也可以交由Nginx來解決跨域,但是有一點需要注意:Nginx解決跨域和后端解決跨域最好只保留一個,兩種混用會出現(xiàn)很多奇怪的問題。

下面是nginx.conf文件解決跨域的相關配置:

server {
        listen       80;
        server_name  localhost;
        location  / {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin 'http://localhost:7060';
                add_header Access-Control-Allow-Headers '*';
                add_header Access-Control-Allow-Methods '*';
                add_header Access-Control-Allow-Credentials 'true';
                return 204;
            }
            if ($request_method != 'OPTIONS') {
                add_header Access-Control-Allow-Origin 'http://localhost:7060' always;
                add_header Access-Control-Allow-Credentials 'true';
            }
            proxy_pass  http://localhost:59200; 
        }
    }

5,注意

說明: 文章中很多地方為了方便,Access-Control-Allow-Origin設置成了*,這個在開發(fā)測試的時候可以這么設置,但如果是生產(chǎn)環(huán)境,建議不要設置成*,最好是允許哪些域名訪問就設置哪些,畢竟限制域名還是很有必要的。

總結

到此這篇關于Spring Boot項目中解決跨域問題四種方式的文章就介紹到這了,更多相關SpringBoot解決跨域問題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一篇文章帶你了解Maven的坐標概念以及依賴管理

    一篇文章帶你了解Maven的坐標概念以及依賴管理

    這篇文章主要為大家介紹了Maven的坐標概念以及依賴管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java使用路徑通配符加載Resource與profiles配置使用詳解

    Java使用路徑通配符加載Resource與profiles配置使用詳解

    這篇文章主要介紹了Java使用路徑通配符加載Resource與profiles配置使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 簡單了解Java垃圾回收器的種類

    簡單了解Java垃圾回收器的種類

    這篇文章主要介紹了簡單了解Java垃圾回收器的種類,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java 中單例模式餓漢式與懶漢式的對比

    java 中單例模式餓漢式與懶漢式的對比

    這篇文章主要介紹了java 中單例模式餓漢式與懶漢式的對比的相關資料,這里對這兩種單例模式進行對比,希望大家能理解并應用,需要的朋友可以參考下
    2017-08-08
  • Java實現(xiàn)驗證碼的產(chǎn)生和驗證

    Java實現(xiàn)驗證碼的產(chǎn)生和驗證

    這篇文章主要為大家詳細介紹了Java實現(xiàn)驗證碼的產(chǎn)生和驗證,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2012-01-01
  • java基礎之方法詳解

    java基礎之方法詳解

    這篇文章主要介紹了java基礎之方法詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-07-07
  • JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解

    JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解

    這篇文章主要為大家介紹了JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解Maven打包和運行

    詳解Maven打包和運行

    這篇文章主要介紹了Maven打包和運行的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Java?DelayQueue實現(xiàn)延時任務的示例詳解

    Java?DelayQueue實現(xiàn)延時任務的示例詳解

    DelayQueue是一個無界的BlockingQueue的實現(xiàn)類,用于放置實現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。本文就來利用DelayQueue實現(xiàn)延時任務,感興趣的可以了解一下
    2022-08-08
  • JAVA如何按字節(jié)截取字符串

    JAVA如何按字節(jié)截取字符串

    這篇文章主要介紹了JAVA如何按字節(jié)截取字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01

最新評論

美姑县| 萍乡市| 安塞县| 嘉黎县| 中西区| 宁都县| 江口县| 江华| 台北市| 云南省| 怀安县| 安龙县| 达日县| 丰镇市| 彭泽县| 株洲市| 轮台县| 南平市| 佳木斯市| 项城市| 兖州市| 石家庄市| 兴文县| 万山特区| 台北县| 河池市| 岑溪市| 碌曲县| 千阳县| 安陆市| 双鸭山市| 黄浦区| 印江| 玛纳斯县| 来安县| 安塞县| 曲阳县| 迁安市| 江达县| 建阳市| 象州县|