spring中处理跨域的3种方案

前言

跨域是指一个域下的文件想要和另一个域下的资源发生HTTP通信时,浏览器出于安全限制所引发的问题。如果协议、子域名、主域名、端口有任何一个不同,都会出现跨域问题。

举个例子,如果一个网页来自https://www.example.com,那么它只能访问同域下的资源,如https://www.example.com/data.json。但如果它想访问https://api.example.com/data.json或https://www.other.com/data.json,就会因为跨域而被浏览器拦截。

解决

spring 中处理跨域的3种方案

  • 在需要配置跨域的接口上 使用 @CrossOrigin注解 当有多个接口时 需要配置多个 过于繁琐 不推荐

    java 复制代码
    @RestController
    public class TestController {
    
        @GetMapping("/hello")
        @CrossOrigin(origins = "localhost:8080",allowedHeaders = "*",methods = RequestMethod.GET,allowCredentials = "true",maxAge = 3600L)
        public String hello() {
            return "hello";
        }
    }    
  • 重写 WebMvcConfigurer#taddCorsMappings

java 复制代码
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .allowedOrigins("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}
  • 配置 corsFilter
    在如下配置中 我们初始化了CorsConfiguration 并设置了属性 最后将其配置给 UrlBasedCorsConfigurationSource 最后使用 FilterRegistrationBean 注册 corsFilter (使用带UrlBasedCorsConfigurationSource 构造参数进行初始化) 并给corsFilter设置为最高优先级
java 复制代码
@Configuration
public class CorsConfig {


    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedHeaders(List.of("*"));
        corsConfiguration.setAllowedMethods(List.of("*"));
        corsConfiguration.setAllowedOrigins(List.of("http://localhost:8081"));
        corsConfiguration.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);
        registrationBean.setFilter(new CorsFilter(source));
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }

}

总结

汇总一下Spring中处理跨域的三种方案的优缺点:

  1. 使用 @CrossOrigin 注解 灵活 适用于需要跨域的接口不多的情况下。
  2. 重写 WebMvcConfigurer#taddCorsMappings 统一管理 支持给不同url 配置跨域规则 但是需要引入额外的配置类 本质上使用Interceptor 处理 处理顺序较为靠后
  3. 配置 corsFilter 统一管理 支持给不同url 配置跨域规则 但是需要引入额外的配置类 ,处理顺序相比较前面两者,并比较靠前。同时会增加接口过滤器的执行链路 (推荐使用)

这就是spring为我们提供的三种跨域方法 ,三种都可以解决问题 任选其中一种即可。需要说明的是:

注意:

@CrossOrigin 注解十 重写 addCorsMappings 方法同时配置,这两种方式中关于跨域的配置会自动合并.跨域在 Cors interceptor 中只处理了一次

@CrossOrigin 注解+ CorsFilter 同时配置,或者重写addCorsMappings 方法 + CorsFitler同时配置,都会导致跨域在 CorsInterceptor 和 CorsFilter 中各处理了一次,降低程序运行效率,这种组合不可取。


good day !!!

相关推荐
鼠爷ねずみ7 小时前
SpringCloud前后端整体开发流程-以及技术总结文章实时更新中
java·数据库·后端·spring·spring cloud
从心归零10 小时前
springboot-jpa的批量更新方法
java·spring boot·spring
LiamTuc10 小时前
Hibernate‌
spring
小许学java13 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
这是程序猿15 小时前
基于java的ssm框架经典电影推荐网站
java·开发语言·spring boot·spring·经典电影推荐网站
jiayong2315 小时前
海外求职平台与策略指南
java·spring
SadSunset16 小时前
(37)全注解式开发AOP
java·spring
子超兄16 小时前
Bean生命周期
java·spring
Mr.朱鹏17 小时前
超时订单处理方案实战指南【完整版】
java·spring boot·redis·spring·rabbitmq·rocketmq·订单
Lisonseekpan18 小时前
RBAC 基于角色的访问控制模型详解与实践指南
java·服务器·网络·后端·spring·log4j