成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 SpringBoot 解決跨域訪問(wèn)的多種實(shí)現(xiàn)方式

開(kāi)發(fā) 項(xiàng)目管理
我們可以在 SpringBoot 項(xiàng)目中有效地解決跨域訪問(wèn)問(wèn)題。在實(shí)際開(kāi)發(fā)中,可以根據(jù)項(xiàng)目的具體需求和架構(gòu)選擇合適的方式。

在當(dāng)今的 Web 應(yīng)用開(kāi)發(fā)中,跨域訪問(wèn)問(wèn)題是一個(gè)常見(jiàn)且關(guān)鍵的挑戰(zhàn)。跨域訪問(wèn)指的是當(dāng)一個(gè)網(wǎng)頁(yè)中的腳本(通常是 JavaScript)試圖從一個(gè)與當(dāng)前網(wǎng)頁(yè)的源(包括域名、協(xié)議和端口)不同的服務(wù)器獲取資源或進(jìn)行數(shù)據(jù)交互時(shí)所面臨的限制。這種限制是由瀏覽器的同源策略所施加的。

同源策略的核心原則是確保只有來(lái)自相同源的網(wǎng)頁(yè)能夠相互訪問(wèn)和交互數(shù)據(jù)。其主要目的是保護(hù)用戶(hù)的隱私和安全,防止惡意網(wǎng)站通過(guò)腳本獲取用戶(hù)在其他網(wǎng)站上的敏感信息。

然而,在許多現(xiàn)代的 Web 應(yīng)用架構(gòu)中,如前后端分離的模式,前端頁(yè)面可能運(yùn)行在一個(gè)域名(例如:www.frontend.com),而后端服務(wù)則部署在另一個(gè)域名(例如:api.backend.com)。這種架構(gòu)上的分離導(dǎo)致了跨域訪問(wèn)的需求。

當(dāng)發(fā)生跨域請(qǐng)求時(shí),瀏覽器會(huì)在發(fā)送請(qǐng)求前進(jìn)行預(yù)檢(Preflight)操作。預(yù)檢請(qǐng)求使用 OPTIONS 方法發(fā)送,以獲取服務(wù)器對(duì)跨域請(qǐng)求的許可信息,包括允許的請(qǐng)求方法、請(qǐng)求頭和其他相關(guān)權(quán)限。如果服務(wù)器的響應(yīng)不符合瀏覽器的預(yù)期,跨域請(qǐng)求將被阻止。

跨域訪問(wèn)問(wèn)題不僅影響到簡(jiǎn)單的數(shù)據(jù)獲取,還可能涉及到復(fù)雜的操作,如發(fā)送 POST 請(qǐng)求、攜帶自定義請(qǐng)求頭或需要使用 Cookie 進(jìn)行身份驗(yàn)證等。解決跨域問(wèn)題需要綜合考慮安全性、性能和可擴(kuò)展性等多個(gè)方面,以確保在滿(mǎn)足業(yè)務(wù)需求的同時(shí),不會(huì)引入新的安全風(fēng)險(xiǎn)。

項(xiàng)目創(chuàng)建及依賴(lài)配置(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cors-solution</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>CORS Solution</name>

    <properties>
        <java.version>19</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

配置文件(application.yml)

server:
  port: 8080
cors:
  allowed-origins: http://your-frontend-domain.com
  allowed-methods: *
  allowed-headers: *
  allow-credentials: true

跨域配置類(lèi)(方式一:使用全局配置)

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 {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 從配置文件中讀取允許的源
        config.setAllowedOrigins(Arrays.asList(
                Objects.requireNonNull(this.getProperties().get("cors.allowed-origins"))
                      .toString().split(",")));
        // 從配置文件中讀取允許的方法
        config.setAllowedMethods(Arrays.asList(
                Objects.requireNonNull(this.getProperties().get("cors.allowed-methods"))
                      .toString().split(",")));
        // 從配置文件中讀取允許的請(qǐng)求頭
        config.setAllowedHeaders(Arrays.asList(
                Objects.requireNonNull(this.getProperties().get("cors.allowed-headers"))
                      .toString().split(",")));
        // 從配置文件中讀取是否允許攜帶憑證
        config.setAllowCredentials(Boolean.parseBoolean(
                Objects.requireNonNull(this.getProperties().get("cors.allow-credentials"))
                      .toString()));

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);
    }

    private Properties getProperties() {
        return new PropertiesLoaderUtils().loadProperties(new ClassPathResource("application.yml"));
    }
}

控制器類(lèi)(提供測(cè)試接口)

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

@RestController
public class TestController {

    @GetMapping("/test")
    public String test() {
        return "跨域測(cè)試成功!";
    }
}

前端頁(yè)面(index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跨域測(cè)試</title>
</head>
<body>
    <h1>跨域測(cè)試頁(yè)面</h1>
    <button onclick="fetchData()">獲取數(shù)據(jù)</button>
    <script>
        function fetchData() {
            fetch('http://your-backend-domain.com/test')
           .then(response => response.text())
           .then(data => {
                    console.log(data);
                })
           .catch(error => console.error('錯(cuò)誤:', error));
        }
    </script>
</body>
</html>

方式二:在控制器方法上使用注解

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @CrossOrigin(origins = "http://your-frontend-domain.com")
    @GetMapping("/test")
    public String test() {
        return "跨域測(cè)試成功!";
    }
}

其他方法

除了上述兩種常見(jiàn)的方法外,還可以通過(guò)配置 WebMvcConfigurer 來(lái)解決跨域問(wèn)題。

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 CorsConfigurer implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 從配置文件中讀取相關(guān)屬性
        registry.addMapping("/**")
              .allowedOrigins(Arrays.asList(
                        Objects.requireNonNull(this.getProperties().get("cors.allowed-origins"))
                              .toString().split(",")))
              .allowedMethods(Arrays.asList(
                        Objects.requireNonNull(this.getProperties().get("cors.allowed-methods"))
                              .toString().split(",")))
              .allowedHeaders(Arrays.asList(
                        Objects.requireNonNull(this.getProperties().get("cors.allowed-headers"))
                              .toString().split(",")))
              .allowCredentials(Boolean.parseBoolean(
                        Objects.requireNonNull(this.getProperties().get("cors.allow-credentials"))
                              .toString()));
    }

    private Properties getProperties() {
        return new PropertiesLoaderUtils().loadProperties(new ClassPathResource("application.yml"));
    }
}

總結(jié)

通過(guò)以上多種方式,我們可以在 SpringBoot 項(xiàng)目中有效地解決跨域訪問(wèn)問(wèn)題。在實(shí)際開(kāi)發(fā)中,可以根據(jù)項(xiàng)目的具體需求和架構(gòu)選擇合適的方式。全局配置適用于整個(gè)應(yīng)用的所有接口,在控制器方法上使用注解則可以更靈活地控制特定接口的跨域策略,而通過(guò)配置 WebMvcConfigurer 也是一種可行的選擇。

責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2019-11-11 17:34:16

前端開(kāi)發(fā)技術(shù)

2009-05-21 14:47:38

WEB開(kāi)發(fā)JsonAjax

2024-08-28 08:45:22

2024-10-29 16:41:24

SpringBoot跨域Java

2010-10-08 10:35:21

2024-12-02 14:30:20

2010-02-24 10:55:01

WCF跨域訪問(wèn)

2010-07-30 12:40:00

Flex跨域訪問(wèn)

2018-01-18 14:50:56

Nginx實(shí)現(xiàn)CDSW

2021-04-27 15:20:41

人工智能機(jī)器學(xué)習(xí)技術(shù)

2019-01-23 08:48:50

跨域協(xié)議端口

2018-11-26 14:52:12

Web前端跨域

2024-05-20 09:28:44

Spring客戶(hù)端瀏覽器

2021-06-15 07:32:59

Cookie和Sess實(shí)現(xiàn)跨域

2017-08-20 12:49:59

瀏覽器跨域服務(wù)器

2012-06-05 10:15:43

jQuery

2009-12-22 11:21:43

WCF跨域訪問(wèn)

2009-02-18 09:30:10

AJAX跨域XML

2023-05-06 15:32:04

2024-01-25 11:04:51

跨域問(wèn)題反向代理層網(wǎng)關(guān)層
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜一区 | 欧美日韩1区 | 久久精品国产一区二区电影 | 在线欧美视频 | 精品三级在线观看 | 欧美日韩精品久久久免费观看 | 美女福利视频 | 精品视频在线播放 | 久婷婷 | 免费久草 | 日日综合 | 欧美日韩在线一区二区 | 国产婷婷综合 | 黄色毛片黄色毛片 | aaaa日韩 | 久久久久久久国产精品影院 | 日韩中文字幕在线不卡 | 在线一级片 | 免费观看一级特黄欧美大片 | 日韩视频一区 | 91精品久久久久久久久中文字幕 | 亚洲成在线观看 | 黄色网址在线免费播放 | 午夜成人免费视频 | 久久亚洲一区二区三区四区 | 欧美久久久久久久 | 日韩毛片免费看 | 久久久久久天堂 | 国产精品美女久久久av超清 | 中文字幕在线播放不卡 | 国产精品毛片无码 | 一级毛片,一级毛片 | 欧美国产一区二区 | 天堂av中文在线 | 国产免费一区二区三区免费视频 | 日本又色又爽又黄又高潮 | 天堂综合网久久 | 日韩欧美一区二区三区免费看 | 四虎影视 | 成人精品视频 | 成人在线观看网址 |