亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?Boot項(xiàng)目中解決跨域問(wèn)題的四種方式總結(jié)

 更新時(shí)間:2025年02月13日 10:26:10   作者:額?無(wú)語(yǔ)  
這篇文章主要介紹了瀏覽器同源策略限制導(dǎo)致的跨域問(wèn)題,并詳細(xì)記錄了常見(jiàn)的跨域解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

開(kāi)發(fā)項(xiàng)目的時(shí)候因?yàn)闉g覽器同源策略的限制,經(jīng)常會(huì)遇到跨域問(wèn)題,本篇文章對(duì)常見(jiàn)的跨域解決方案做一個(gè)記錄。

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

之所以產(chǎn)生跨域主要是因?yàn)闉g覽器同源策略的限制。

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

當(dāng)一個(gè)瀏覽器的兩個(gè)tab頁(yè)中分別打開(kāi)來(lái)自百度和谷歌的頁(yè)面,當(dāng)瀏覽器的百度tab頁(yè)執(zhí)行一個(gè)腳本的時(shí)候會(huì)檢查這個(gè)腳本是屬于哪個(gè)頁(yè)面的,即檢查是否同源,只有和百度同源的腳本才會(huì)被執(zhí)行。如果非同源,那么在請(qǐng)求數(shù)據(jù)時(shí),瀏覽器會(huì)在控制臺(tái)中報(bào)一個(gè)異常,提示拒絕訪問(wèn)。

二,什么情況下算跨域

一個(gè)域名地址由以下幾個(gè)部分組成:

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

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

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

http://www.aaa.com:8080——>http://www.aaa.com:8080:同域訪問(wèn)
http://www.aaa.com:8080——>http://www.bbb.com:8080:跨域訪問(wèn)

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

三,實(shí)際演示

下面我們以一個(gè)實(shí)際功能為例:用戶輸入用戶名密碼,發(fā)往服務(wù)端驗(yàn)證。

因?yàn)闉g覽器同源策略的限制,在瀏覽器控制臺(tái)提示我們:

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的請(qǐng)求,這是瀏覽器自動(dòng)發(fā)送的,為了驗(yàn)證是否允許跨域訪問(wèn)。

四,解決跨域的方法

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

1,@CrossOrigin注解

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

@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ù)錯(cuò)誤");
    }

    TickToken tickToken = ILoginService.loginSystem(user);

    return Result.success(tickToken);
}

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

2,添加全局過(guò)濾器

若項(xiàng)目中所有接口都允許跨域訪問(wèn),可增加全局過(guò)濾器允許跨域訪問(wèn)。

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 {
    // 當(dāng)前跨域請(qǐng)求最大有效時(shí)長(zhǎng)。這里默認(rèn)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 設(shè)置訪問(wèn)源地址,或者h(yuǎn)ttp://localhost:7060
        corsConfiguration.addAllowedHeader("*"); // 2 設(shè)置訪問(wèn)源請(qǐng)求頭
        corsConfiguration.addAllowedMethod("*"); // 3 設(shè)置訪問(wèn)源請(qǐng)求方法,或設(shè)置為"GET", "POST", "DELETE", "PUT"
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 對(duì)接口配置跨域設(shè)置
        return new CorsFilter(source);
    }
}

3,實(shí)現(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 {
    // 當(dāng)前跨域請(qǐng)求最大有效時(shí)長(zhǎng)。這里默認(rèn)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解決跨域

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

下面是nginx.conf文件解決跨域的相關(guān)配置:

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,注意

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

總結(jié)

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

相關(guān)文章

  • Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法

    Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • JDBC增刪改查和查唯一的完整代碼解析

    JDBC增刪改查和查唯一的完整代碼解析

    這篇文章主要介紹了JDBC增刪改查和查唯一的完整代碼解析,代碼分為第四部分,每部分代碼都不錯(cuò),對(duì)jdbc增刪改查操作感興趣的朋友一起學(xué)習(xí)吧
    2016-12-12
  • 解決mybatisPlus 中的field-strategy配置失效問(wèn)題

    解決mybatisPlus 中的field-strategy配置失效問(wèn)題

    這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • JAVA多線程的使用場(chǎng)景與注意事項(xiàng)總結(jié)

    JAVA多線程的使用場(chǎng)景與注意事項(xiàng)總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA多線程的使用場(chǎng)景與注意事項(xiàng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法

    用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法

    今天小編就為大家分享一篇用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 基于spring三方包類注入容器的四種方式小結(jié)

    基于spring三方包類注入容器的四種方式小結(jié)

    這篇文章主要介紹了基于spring三方包類注入容器的四種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Jmeter分布式壓力測(cè)試實(shí)現(xiàn)過(guò)程詳解

    Jmeter分布式壓力測(cè)試實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了Jmeter分布式壓力測(cè)試實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能

    Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能

    這篇文章主要介紹了Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能,在實(shí)際的業(yè)務(wù)中,可以根據(jù)客戶的需求設(shè)置不同的文件上傳需求,支持普通服務(wù)器上傳+分布式上傳(Fast DFS)+云服務(wù)上傳OSS(OSS),需要的朋友可以參考下
    2024-04-04
  • java并發(fā)無(wú)鎖多線程單線程示例詳解

    java并發(fā)無(wú)鎖多線程單線程示例詳解

    這篇文章主要為大家介紹了java并發(fā)無(wú)鎖多線程單線程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • JavaMail郵件簡(jiǎn)介及API概述第一篇

    JavaMail郵件簡(jiǎn)介及API概述第一篇

    這篇文章主要為大家詳細(xì)介紹了JavaMail郵件簡(jiǎn)介及API概述第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論