首页 > 编程 > Java > 正文

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

2019-11-26 10:18:03
字体:
来源:转载
供稿:网友

背景

现在做的很多项目都是前后端分离的,这就引出一个很常见的问题,我们的页面和接口是在不同域名下的,当我们通过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映射。

@Configurationpublic 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@EnableWebMvcpublic class CorsConfiguration_2 extends WebMvcConfigurerAdapter {  @Override  public void addCorsMappings(CorsRegistry registry) {    registry.addMapping("/api/**");  }}

corsFilter

这种方式现在很少用

@Component@EnableWebMvcpublic 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;  }}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表