欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring boot 总结之跨域处理cors的方法

程序员文章站 2023-11-17 16:44:46
背景 现在做的很多项目都是前后端分离的,这就引出一个很常见的问题,我们的页面和接口是在不同域名下的,当我们通过ajax访问后端接口的时候就会出现跨域问题,这种问题我们怎么...

背景

现在做的很多项目都是前后端分离的,这就引出一个很常见的问题,我们的页面和接口是在不同域名下的,当我们通过ajax访问后端接口的时候就会出现跨域问题,这种问题我们怎么解决呢?一般来说就是cors和jsonp这两种方案。spring简化了cors的配置,接下来我们来看一下它提供的cors。

跨域问题描述

web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,cors等等。

cors 与 jsonp 相比:

1、 jsonp 只能实现 get 请求,而 cors 支持所有类型的 http 请求。
2、 使用 cors,开发者可以使用普通的 xmlhttprequest 发起请求和获得数据,比起 jsonp 有更好的 错误处理。
3、 jsonp 主要被老的浏览器支持,它们往往不支持 cors,而绝大多数现代浏览器都已经支持了 cors。

webmvcconfigurer对象

我们可以初始化一个webmvcconfigurer对象来配置我们的cors映射。

@configuration
public class corscongiguration {
  @bean
  public webmvcconfigurer corsconfigurer() {
    return new webmvcconfigureradapter() {
      @override
      public void addcorsmappings(corsregistry registry) {
        registry.addmapping("/api/**"); // 允许所有第三方域名访问该接口
        // .allowedorigins("http://domain2.com")//指定来源域名
        // .allowedmethods("put", "delete")
        // .allowedheaders("header1", "header2", "header3")
        // .exposedheaders("header1", "header2")
        // .allowcredentials(false).maxage(3600);
      }
    };
  }
}

继承webmvcconfigureradapter

这种方式跟上面的方式很类似

@configuration
@enablewebmvc
public class corsconfiguration_2 extends webmvcconfigureradapter {

  @override
  public void addcorsmappings(corsregistry registry) {
    registry.addmapping("/api/**");
  }
}

corsfilter

这种方式现在很少用

@component
@enablewebmvc
public class corsfiltercongiguration extends corsfilter {

  public corsfiltercongiguration(corsconfigurationsource configsource) {
    super(configsource);
  }

  @bean
  public filterregistrationbean corsfilter() {
    urlbasedcorsconfigurationsource source = new urlbasedcorsconfigurationsource();
    corsconfiguration config = new corsconfiguration();
    config.setallowcredentials(true);
    config.addallowedorigin("*");
//    config.addallowedorigin("http://domain1.com");
    config.addallowedheader("*");
    config.addallowedmethod("*");
    source.registercorsconfiguration("/api/**", config);
    filterregistrationbean bean = new filterregistrationbean(new corsfilter(source));
    bean.setorder(0); // 必须在所有filter之前
    return bean;
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。