您的位置:

SpringBoot跨域配置详解

一、跨域解释

1、什么是跨域

在前后端分离的应用中,前端代码和后端代码往往是部署在不同的服务器上,而浏览器为了保证用户的安全和隐私,设计了同源策略。同源策略意味着1个网站只能读取同域下的数据,同域指的是协议、域名、端口号三者都相同。当一个站点试图访问另一个站点下不同域的资源时,就会发生跨域(Cross Origin)。跨域一般会导致浏览器拦截请求,不允许跨域请求的执行。

2、为什么需要跨域

考虑一种可能性:对于前后端分离的复杂应用场景下,同一站点的服务端和客户端往往是不同的部署,所以就需要前端向其他服务器发起请求获取数据或其他的服务。例如,前端页面通过AJAX请求获取数据或者图片都需要通过跨域手段访问。

二、SpringBoot跨域方式

1、通过注解方式实现

在方法或类上添加@CrossOrigin注解即可实现跨域

@Controller
@RequestMapping("/user")
@CrossOrigin(origins = "*", maxAge = 3600)
public class UserController {

    @PostMapping("addUser")
    public String addUser(@RequestBody User user) {
        // 添加用户
    }
}

2、通过配置文件方式实现

在SpringBoot工程的application.properties或application.yml文件中添加以下三个属性配置:

spring.mvc.allow-credentials=true 
spring.mvc.crossorigin.allowed-headers=* 
spring.mvc.crossorigin.allowed-methods=GET,POST

说明:

spring.mvc.allow-credentials=true:表示支持跨域cookie,需要配合前端设置withCredentials:true。

spring.mvc.crossorigin.allowed-headers:表示浏览器端需要预配的属性名称,例如X-Requested-With、Content-Type等。

spring.mvc.crossorigin.allowed-methods:表示允许访问接口的HTTP方法,例如GET、POST等。

3、通过WebMvcConfigurer方式实现

创建CorsConfiguration对象并设置属性后,注册到CorsRegistration对象(为了方便在全局配置跨域),最后enable CORS:

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/user/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST");
    }
}

三、SpringBoot跨域的注意事项

1、精确定义allowed-origins

因为*会匹配所有来源,所以尽量精确,写入具体域名或者ip地址,不然很容易遭受CSRF跨站请求伪造的攻击。

2、优先选择前两种方式

避免在配置文件中写太多的跨域配置,尽量选择通过注解和WebMvcConfigurer方式进行跨域配置,这两种方式对单个方法或单个接口配置最方便。

3、前后端请求携带cookie需配置allow-credentials

如果前端在请求时带有cookie值,则需要后端进行允许跨域请求携带cookie,否则会被浏览器拦截。如果没有携带cookie则无需配置。

四、总结

SpringBoot跨域配置的方法有三种,通过注解、配置文件以及WebMvcConfigurer方式实现。合理配置SpringBoot跨域可以提高前后端开发效率和用户体验,并增强应用的安全性。在配置跨域时应注意合理精确定义allowed-origins、优先选择前两种方式、允许跨域请求携带cookie等方法。