跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。

跨域三种情况

在请求时,如果出现一下任意的一种情况,就会出现跨域

  1. 协议不同,如http和https
  2. 域名不同
  3. 端口不同

也就是说,即使域名相同,如果一个使用的是 http,另一个使用的是 https,那么它们也属于跨域访问。

解决跨域问题

在 Spring  Boot 中跨域问题有很多种解决方案,比如以下 3 个:

  1. 使用 @CrossOrigin 注解实现跨域。
  2. 通过配置文件实现跨域。
  3. 通过 CorsFilter 对象实现跨域。

解决方案1:通过注解跨域

使用 @CrossOrigin 注解可以轻松的实现跨域,此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,它的实现如下:

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

import org.springframework.web.bind.annotation.RequestMapping;

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

import java.util.HashMap;

 

@RestController

@CrossOrigin(origins = "*")

public class TestController {

   @RequestMapping("/test")

   public String test() {

       return "success";

   }

}

解决方案2:通过配置文件跨域

接下来我们通过设置配置文件的方式就可以实现全局跨域了,创建一个新配置文件;添加 @Configuration注解,实现 WebMvcConfigurer接口;重写addCorsMappings方法,设置允许跨域的代码。

具体实现代码如下:

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

   @Override

   public void addCorsMappings(CorsRegistry registry) {

       registry.addMapping("/**") // 所有接口

               .allowCredentials(true) // 是否发送 Cookie

               .allowedOriginPatterns("*") // 支持域

               .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法

               .allowedHeaders("*")

               .exposedHeaders("*");

   }

}

解决方案3:通过 CorsFilter 跨域

此实现方式和上一种实现方式类似,它也可以实现全局跨域,它的具体实现代码如下:

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种:通过注解实现局部跨域、通过配置文件实现全局跨域、通过 CorsFilter 对象实现全局跨域。