SpringBoot解决跨域最佳实践

简介: 本文介绍了跨域问题的起因及最佳实践,重点讲解了SpringBoot中如何利用`CorsFilter`解决跨域问题。首先解释了由于浏览器的同源策略限制导致的跨域现象,然后提出了在服务端入口处解决跨域问题的建议,最后详细展示了三种SpringBoot中配置跨域的方法:使用默认配置、自定义配置规则以及通过配置文件管理跨域设置,以适应不同的应用场景。

引起跨域的原因

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略, 则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

跨域的最佳实践

生产环境中,最好是在服务端的入口出解决跨越问题,比如通过nginx或者API网关解决跨域问题, 这样我们的每个微服务就不需要关注跨域的问题。因为跨域如果解决多次,还会出现错误。导致客户端不能正常访问。 那既然说跨域问题应该交给请求的入口解决,那么我们的SpringBoot项目是否还需要解决跨域问题呢?答案是需要,因为在日常联调的时候,我们很可能使用自己的机器进行联调,客户端直接调用,不会走微服务的网关 而且,我们为微服务提供了可以解决跨域的能力,并用开关的形式选配跨域,这样即使API网关没有解决跨域,客户端也能正确访问我们的微服务。

SpringBoot解决跨域

SpringBoot提供了CorsFilter工具类,我们通过配置CorsConfiguration配置跨域,即可解决跨域问题。

  1. 一个最粗暴的跨域配置 全部使用默认的跨域配置,默认的跨域配置意味着所有的请求都会被接受,任何请求都不会跨域,但是这种是很危险的行为,再生产环境中谨慎使用。

java

代码解读

复制代码

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
  1. 通过手动传入跨域配置规则,定制解决跨域 比如,这里只允许请求为GETPOST请求,并且请求的header中只能有token选项,否则会跨域,针对这种场景我们可以使用如下配置

java

代码解读

复制代码

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        
        corsConfiguration.setAllowedHeaders(Collections.singletonList("token"));
        corsConfiguration.setAllowedMethods(Arrays.asList("GET","POST"));
        
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
  1. 解决SpringBoot的配置文件,避免硬编码问题 我们可以使用SpringBoot的配置文件的能力,将跨域信息配置到配置文件中,避免程序的硬编码, 并借助Spring的ConditionalOnProperty为跨域装上开关 这样可以很灵活的针对不同场景进行跨域配置,而且这种形式可以完全独立出来通过SpringBoot的自动/手动装配成一个独立的组件
    3.1 跨域配置类

java

  1. 代码解读
  2. 复制代码
     @Data
     @Component
     @ConfigurationProperties(prefix = "example.web.cors")
     public class CorsProperties {
     /**
     * 是否开启跨域解决
     */
     private Boolean enable;
     /**
     * allowedOrigins 默认是*
     */
     private List<String> allowedOrigins;
     /**
     * allowedMethods 默认是*
     * 例如:{GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE}
     */
     private List<String> allowedMethods;
     /**
     * allowedHeaders 默认是*
     */
     private List<String> allowedHeaders;
     /**
     * exposedHeaders 默认是*
     */
     private List<String> exposedHeaders;
     /**
     * allowCredentials 默认是 true
     */
     private Boolean allowCredentials = true;
     /**
     * maxAge
     */
     private Long maxAge;
     
     }
  1. 3.2 通过配置构造跨域对象

java

  1. 代码解读
  2. 复制代码
 @Bean
 @ConditionalOnProperty(
         prefix = "example.web.cors",
         name = {"enable"},
         havingValue = "true"
 )
 @ConditionalOnMissingBean(value = CorsFilter.class)
 public CorsFilter corsFilter(CorsProperties corsProperties) {
     log.info("\ncors enabled.");
     CorsConfiguration corsConfiguration = generatorCorsConfiguration(corsProperties);
     final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
     urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
     return new CorsFilter(urlBasedCorsConfigurationSource);
 }

 /**
  * 如果没有配置,使用默认的解决方案
  */
 private CorsConfiguration generatorCorsConfiguration(CorsProperties corsProperties) {

     final CorsConfiguration corsConfiguration = new CorsConfiguration();

     List<String> allowedOrigins = corsProperties.getAllowedOrigins();
     if (Objects.isNull(allowedOrigins)) {
         corsConfiguration.addAllowedOrigin(CorsConfiguration.ALL);
     } else {
         corsConfiguration.setAllowedOrigins(allowedOrigins);
     }

     List<String> allowedHeaders = corsProperties.getAllowedHeaders();
     if (Objects.isNull(allowedHeaders)) {
         corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
     } else {
         corsConfiguration.setAllowedHeaders(allowedHeaders);
     }

     List<String> allowedMethods = corsProperties.getAllowedMethods();
     if (Objects.isNull(allowedMethods)) {
         corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
     } else {
         corsConfiguration.setAllowedMethods(allowedMethods);
     }

     Boolean allowCredentials = corsProperties.getAllowCredentials();
     corsConfiguration.setAllowCredentials(allowCredentials);
     corsConfiguration.setMaxAge(corsProperties.getMaxAge());
     return corsConfiguration;
 }
  1. 3.3 配置文件演示

yaml

  1. 代码解读
  2. 复制代码
example:
   web:
     cors:
      # 跨域开关
      enable: true
       allowed-headers:
       - token
       allowed-methods:
       - GET
       - POST


转载来源:https://juejin.cn/post/6999996325907398686

相关文章
|
7天前
|
存储 安全 Java
Spring Boot 编写 API 的 10条最佳实践
本文总结了 10 个编写 Spring Boot API 的最佳实践,包括 RESTful API 设计原则、注解使用、依赖注入、异常处理、数据传输对象(DTO)建模、安全措施、版本控制、文档生成、测试策略以及监控和日志记录。每个实践都配有详细的编码示例和解释,帮助开发者像专业人士一样构建高质量的 API。
|
1月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
23天前
|
安全 Java 应用服务中间件
SpringBoot:CORS是什么?SpringBoot如何解决跨域问题?
CORS是Web开发中常见且重要的机制,SpringBoot通过提供注解、全局配置和过滤器等多种方式来解决跨域问题。选择适合的方式可以帮助开发者轻松处理跨域请求,提高应用的灵活性和安全性。
52 2
|
1月前
|
前端开发 安全 Java
springboot解决跨域问题
跨域问题指前端调用与后端接口不在同一域名或端口时产生的安全限制。本文介绍两种在Spring Boot中解决跨域问题的方法:一是通过配置CorsFilter,二是实现WebMvcConfigurer接口。配置完成后重启项目即可生效。作者:博笙困了。来源:稀土掘金。
|
1月前
|
前端开发 安全 JavaScript
SpringBoot 如何解决跨域问题?
本文深入探讨了Spring Boot解决跨域问题的方法,包括全局配置CORS、使用@CrossOrigin注解和自定义过滤器,提供了详细的代码示例和分析,帮助开发者有效应对Web开发中的跨域挑战。
|
2月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
402 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
29天前
|
Java 测试技术 数据库连接
使用Spring Boot编写测试用例:实践与最佳实践
使用Spring Boot编写测试用例:实践与最佳实践
66 0
|
2月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
168 1
|
2月前
|
JSON 缓存 Java
优雅至极!Spring Boot 3.3 中 ObjectMapper 的最佳实践
【10月更文挑战第5天】在Spring Boot的开发中,ObjectMapper作为Jackson框架的核心组件,扮演着处理JSON格式数据的核心角色。它不仅能够将Java对象与JSON字符串进行相互转换,还支持复杂的Java类型,如泛型、嵌套对象、集合等。在Spring Boot 3.3中,通过优雅地配置和使用ObjectMapper,我们可以更加高效地处理JSON数据,提升开发效率和代码质量。本文将从ObjectMapper的基本功能、配置方法、最佳实践以及性能优化等方面进行详细探讨。
171 2
|
2月前
|
消息中间件 监控 Java
Spring Boot 3.3 后台任务处理:最佳实践与高效策略
【10月更文挑战第10天】 在现代应用程序中,后台任务处理对于提高应用程序的响应性和吞吐量至关重要。Spring Boot 3.3提供了多种机制来实现高效的后台任务处理,包括异步方法、任务调度和使用消息队列等。本文将探讨这些机制的最佳实践和高效策略。
127 0