Skip to content

SpringBoot3教程 - 16 跨域配置

16.1 概念解释

16.1 什么是动静分离

动静分离是指在Web服务器架构中,将静态页面和动态内容接口分为不同系统的架构设计方法。

目前比较常用的方式是:将静态资源(如HTML、CSS、JavaScript、图像文件等)使用 Nginx 来部署,页面上展示的动态数据内容使用后端的 SpringBoot 接口来提供。

使用动静分离有如下优势:

  • 性能优化:静态内容通常可以通过 CDN(内容分发网络)进行缓存和分发,减轻服务器负担,加快用户访问速度。
  • 资源利用:动态内容和静态内容由不同的服务器处理,可以根据各自的需求进行优化,充分利用服务器资源。
  • 安全性:将动态和静态内容分离,可以减少服务器暴露在外的攻击面,提高整体安全性。
  • 维护性:静态资源可以独立更新,不影响动态内容的生成和处理,提高网站的可维护性。

16.2 什么是跨域

戳这里 → 什么是跨域?

16.2 SpringBoot跨域配置

下面来介绍 SpringBoot 服务支持跨域的配置,SpringBoot 是服务器的配置方式,所以使用的CORS。

下面介绍两种常用的配置方式。

1 实现WebMvcConfigurer

创建配置类,实现 WebMvcConfigurer 接口,并实现 addCorsMappings 方法。

java
package com.doubibiji.hellospringboot.config;

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("/**")  //所有接口都支持跨域
                .allowedOrigins("*")  // 所有地址都可以访问
                .allowCredentials(true)  // 是否允许请求携带凭证(如 Cookies)
                .allowedMethods("*")  // 允许所有的HTTP请求方法(如"GET","POST","PUT","DELETE","OPTIONS"等)
                .allowedHeaders("*")  // 允许所有的请求头
                .maxAge(3600);  // 跨域请求的缓存时间

        // 或者
        // 可以限制允许跨域的接口、域名、请求方法等
        registry.addMapping("/api/**")  // 只允许 /api/** 路径下的接口
                .allowedOrigins("https://www.foooor.com", "https://www.foooor.com:8080")  // 只允许指定的域名访问
                .allowCredentials(true)  // 是否允许请求带有验证信息
                .allowedMethods("GET", "POST")  // 只允许 GET 和 POST 请求方法
                .allowedHeaders("*")  // 允许所有的请求头
                .maxAge(3600);  // 跨域请求的缓存时间
    }
}

addMapping() 方法可以调用多次,进行多次设置,从而针对不用的域名采用不同的跨域限制。

2 使用@CrossOrigin注解

在 controller 的类或方法上添加 @CrossOrigin 注解,如果添加在类上,表示 controller 中所有的接口都允许跨域请求。

java
package com.doubibiji.hellospringboot.controller;

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

// 允许所有的域名访问
@CrossOrigin("*")  
// 允许一个域名来访问
//@CrossOrigin("http://www.foooor.com")  
// 允许多个域名来访问
//@CrossOrigin({"http://www.foooor.com", "http://www.foooor.com:8080"})  
@RestController
public class HelloWorldController {
    
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}
内容未完......