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

使用 SpringBoot 解決跨域訪問的多種實現方式

開發 項目管理
我們可以在 SpringBoot 項目中有效地解決跨域訪問問題。在實際開發中,可以根據項目的具體需求和架構選擇合適的方式。

在當今的 Web 應用開發中,跨域訪問問題是一個常見且關鍵的挑戰。跨域訪問指的是當一個網頁中的腳本(通常是 JavaScript)試圖從一個與當前網頁的源(包括域名、協議和端口)不同的服務器獲取資源或進行數據交互時所面臨的限制。這種限制是由瀏覽器的同源策略所施加的。

同源策略的核心原則是確保只有來自相同源的網頁能夠相互訪問和交互數據。其主要目的是保護用戶的隱私和安全,防止惡意網站通過腳本獲取用戶在其他網站上的敏感信息。

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

當發生跨域請求時,瀏覽器會在發送請求前進行預檢(Preflight)操作。預檢請求使用 OPTIONS 方法發送,以獲取服務器對跨域請求的許可信息,包括允許的請求方法、請求頭和其他相關權限。如果服務器的響應不符合瀏覽器的預期,跨域請求將被阻止。

跨域訪問問題不僅影響到簡單的數據獲取,還可能涉及到復雜的操作,如發送 POST 請求、攜帶自定義請求頭或需要使用 Cookie 進行身份驗證等。解決跨域問題需要綜合考慮安全性、性能和可擴展性等多個方面,以確保在滿足業務需求的同時,不會引入新的安全風險。

項目創建及依賴配置(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

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

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(",")));
        // 從配置文件中讀取允許的請求頭
        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"));
    }
}

控制器類(提供測試接口)

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

@RestController
public class TestController {

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

前端頁面(index.html)

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

其他方法

除了上述兩種常見的方法外,還可以通過配置 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 CorsConfigurer implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 從配置文件中讀取相關屬性
        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"));
    }
}

總結

通過以上多種方式,我們可以在 SpringBoot 項目中有效地解決跨域訪問問題。在實際開發中,可以根據項目的具體需求和架構選擇合適的方式。全局配置適用于整個應用的所有接口,在控制器方法上使用注解則可以更靈活地控制特定接口的跨域策略,而通過配置 WebMvcConfigurer 也是一種可行的選擇。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2019-11-11 17:34:16

前端開發技術

2009-05-21 14:47:38

WEB開發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跨域訪問

2010-07-30 12:40:00

Flex跨域訪問

2018-01-18 14:50:56

Nginx實現CDSW

2021-04-27 15:20:41

人工智能機器學習技術

2019-01-23 08:48:50

跨域協議端口

2018-11-26 14:52:12

Web前端跨域

2024-05-20 09:28:44

Spring客戶端瀏覽器

2021-06-15 07:32:59

Cookie和Sess實現跨域

2017-08-20 12:49:59

瀏覽器跨域服務器

2012-06-05 10:15:43

jQuery

2009-02-18 09:30:10

AJAX跨域XML

2023-05-06 15:32:04

2009-12-22 11:21:43

WCF跨域訪問

2018-04-03 16:24:34

分布式方式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜影院在线观看 | av手机在线看| 国产成人精品久久久 | 一级a性色生活片久久毛片波多野 | 久久91精品国产一区二区 | 国产片侵犯亲女视频播放 | 国产成人免费 | 四虎影院美女 | 日本三级日产三级国产三级 | 免费午夜电影 | 亚洲一区二区三区四区在线观看 | 国产一区二区三区在线 | 91久久精品一区二区二区 | 亚洲欧美精品 | 精品入口麻豆88视频 | 91原创视频| 国产高清久久 | 精品视频在线播放 | 涩涩导航| 国产在线a视频 | 国产91在线 | 亚洲 | 国产精品特级毛片一区二区三区 | 操久久| 日批日韩在线观看 | 国产1区2区3区 | 欧美专区在线 | 亚洲国产成人精品久久 | 亚洲一区二区三区视频在线 | 久久久久资源 | 亚洲日本欧美日韩高观看 | 欧美精品片 | 精品亚洲91 | 亚洲第一免费播放区 | 久久精品视频一区二区三区 | 久久久www成人免费精品 | 成人欧美一区二区三区在线播放 | 欧美在线一区二区三区 | 99精品在线 | 久久伊人久久 | 在线黄色影院 | 亚洲一区网站 |