SpringBoot如何实现全局和局部跨域

发布时间:2023-01-09 09:19:17 作者:iii
来源:亿速云 阅读:91

SpringBoot如何实现全局和局部跨域

在现代Web开发中,跨域资源共享(CORS)是一个常见的问题。由于浏览器的同源策略,前端应用在访问不同域名、端口或协议的资源时,可能会遇到跨域问题。Spring Boot 提供了多种方式来解决跨域问题,既可以在全局范围内配置跨域,也可以在局部范围内进行配置。本文将详细介绍如何在Spring Boot中实现全局和局部跨域。

1. 什么是跨域?

跨域是指浏览器从一个域名的网页去请求另一个域名的资源。由于浏览器的同源策略,默认情况下,跨域请求是被禁止的。同源策略要求请求的协议、域名和端口必须完全相同,否则就会被认为是跨域请求。

跨域请求的常见场景包括:

为了解决跨域问题,服务器需要在响应头中添加一些特定的字段,告诉浏览器允许跨域请求。

2. Spring Boot 中的跨域配置

Spring Boot 提供了多种方式来处理跨域问题,既可以通过全局配置,也可以通过局部配置。下面我们将分别介绍这两种方式。

2.1 全局跨域配置

全局跨域配置是指在应用级别对所有请求进行跨域处理。Spring Boot 提供了多种方式来实现全局跨域配置。

2.1.1 使用 @CrossOrigin 注解

@CrossOrigin 注解可以用于控制器类或方法上,以允许跨域请求。如果将其应用于控制器类上,则该类中的所有方法都将允许跨域请求。

@RestController
@CrossOrigin(origins = "*")
public class MyController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的例子中,@CrossOrigin(origins = "*") 表示允许所有来源的跨域请求。

2.1.2 使用 WebMvcConfigurer 配置

通过实现 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 WebConfig implements WebMvcConfigurer {

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

在上面的配置中,addMapping("/**") 表示对所有路径应用跨域配置,allowedOrigins("*") 表示允许所有来源的跨域请求,allowedMethods 指定允许的HTTP方法,allowedHeaders 指定允许的请求头,allowCredentials 表示是否允许发送凭证(如cookies),maxAge 表示预检请求的缓存时间。

2.1.3 使用 CorsFilter 配置

通过自定义 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 CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

在上面的配置中,CorsConfiguration 对象用于配置跨域规则,UrlBasedCorsConfigurationSource 用于将配置应用到所有路径。

2.2 局部跨域配置

局部跨域配置是指在特定的控制器或方法上配置跨域规则。Spring Boot 提供了 @CrossOrigin 注解来实现局部跨域配置。

2.2.1 使用 @CrossOrigin 注解

@CrossOrigin 注解可以应用于控制器类或方法上,以允许跨域请求。

@RestController
public class MyController {

    @GetMapping("/hello")
    @CrossOrigin(origins = "http://example.com")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的例子中,@CrossOrigin(origins = "http://example.com") 表示只允许来自 http://example.com 的跨域请求。

2.2.2 使用 @CrossOrigin 注解的多个配置

@CrossOrigin 注解还支持多个配置项,可以根据需要灵活配置。

@RestController
public class MyController {

    @GetMapping("/hello")
    @CrossOrigin(origins = {"http://example.com", "http://localhost:8080"}, 
                 methods = {RequestMethod.GET, RequestMethod.POST}, 
                 allowedHeaders = {"Content-Type", "Authorization"}, 
                 allowCredentials = "true", 
                 maxAge = 3600)
    public String hello() {
        return "Hello, World!";
    }
}

在上面的例子中,@CrossOrigin 注解配置了多个来源、允许的HTTP方法、允许的请求头、是否允许发送凭证以及预检请求的缓存时间。

3. 总结

Spring Boot 提供了多种方式来处理跨域问题,既可以通过全局配置,也可以通过局部配置。全局配置适用于所有请求,而局部配置则适用于特定的控制器或方法。根据实际需求,可以选择合适的方式来配置跨域规则。

通过合理配置跨域规则,可以确保前端应用能够顺利访问后端API,同时保证安全性。

推荐阅读:
  1. 使用spring boot如何对异常请求进行处理
  2. thymeleaf模板如何在spring boot中使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot

上一篇:Vue脚手架如何配置代理服务器

下一篇:Flutter重构属性透传及函数透传如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》