Rumah  >  Artikel  >  Java  >  Apakah penyelesaian merentas domain untuk projek SpringBoot?

Apakah penyelesaian merentas domain untuk projek SpringBoot?

WBOY
WBOYke hadapan
2023-05-19 12:43:061919semak imbas

Uji sama ada ia merentas domain

Anda boleh membuka konsol halaman dalam penyemak imbas, dan kemudian laksanakan kod berikut dalam konsol:

var xhr = new XMLHttpRequest()
xhr.open('GET', 'http://localhost:8080/user') // 替换请求的方法和地址
xhr.send()
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.responseText)
    }
}

Jika output berikut muncul , Wakil memang mempunyai domain silang

Apakah penyelesaian merentas domain untuk projek SpringBoot?

1. SpringBoot mengkonfigurasi CORS untuk menyelesaikan merentas domain

Iaitu, dalam semua konfigurasi pengepala respons kami untuk membenarkan silang -akses domain, CORS juga telah menjadi penyelesaian merentas domain arus perdana.

  • Buat fail konfigurasi baharu dalam projek

  • Tambah anotasi @Configuration untuk melaksanakan WebMvcConfigurerantara muka

  • Tulis semula kaedah addCorsMappings dan tetapkan kod yang membenarkan merentas domain

Kod khusus adalah seperti berikut:

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 {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 所有接口
                .allowCredentials(true) // 是否发送 Cookie
                .allowedOriginPatterns("*") // 支持域
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 支持方法
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

2. SpringBoot menyelesaikan rentas domain melalui CorsFilter

Kaedah ini serupa dengan kaedah di atas akses merentas domain juga dikonfigurasikan melalui Java Config Kod khusus adalah seperti berikut:

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 MyCorsFilter {
    @Bean
    public CorsFilter corsFilter() {
        // 1.创建 CORS 配置对象
        CorsConfiguration config = new CorsConfiguration();
        // 支持域
        config.addAllowedOriginPattern("*");
        // 是否发送 Cookie
        config.setAllowCredentials(true);
        // 支持请求方式
        config.addAllowedMethod("*");
        // 允许的原始请求头部信息
        config.addAllowedHeader("*");
        // 暴露的头部信息
        config.addExposedHeader("*");
        // 2.添加地址映射
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**", config);
        // 3.返回 CorsFilter 对象
        return new CorsFilter(corsConfigurationSource);
    }
}

3. SpringBoot menyelesaikan rentas domain melalui anotasi

Boleh ditambahkan pada kelas pengawal atau kaedah pengawal kami bermakna semua kaedah di dalamnya boleh menjadi merentas domain kaedah boleh merentas domain Kod khusus adalah seperti berikut:

import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
    @GetMapping
    public String getAll() {
        return "成功";
    }
}

4. Konfigurasikan CORS melalui nginx untuk menyelesaikan masalah merentas domain

Jika projek kami berguna sebagai pelayan proksi terbalik, nginx juga boleh dikonfigurasikan dalam nginx untuk menyelesaikan masalah merentas domain Contoh konfigurasi adalah seperti berikut: CORS

1 Benarkan semua nama domain

server {
    ...
    location / {
        #允许 所有头部 所有域 所有方法
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Headers' '*';
        add_header 'Access-Control-Allow-Methods' '*';
        #OPTIONS 直接返回204
        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }
    ...
}

2

rreeee

Atas ialah kandungan terperinci Apakah penyelesaian merentas domain untuk projek SpringBoot?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam