SpringBoot服务端如何设置跨域资源共享(CORS)

590 阅读2分钟

浏览器同源策略

定义

  同源策略不属于HTTP协议,它是浏览器的一个规范限制。
  同源即两个网络资源的“协议”、“域名”、“端口”都是一样的。浏览器不允许A网站去访问B网站的资源,这就是浏览器的同源策略

作用

  浏览器的同源策略保证了用户保存在浏览器中的其他网站的信息(比如cookie),不会被恶意的网站or脚本来获取到,并做一些侵犯用户权益的事情。打个比方,加入没有同源策略就会出现以下情况:

  为了维护网站运行,小黑挂了一张收款码,觉得网站不错的可以适当资助一点,可是无奈伸手党太多,小黑的网站入不敷出。
  于是他非常生气的在网页中写了一段js代码,使用ajax向淘宝发起登陆请求,因为很多数人都访问过淘宝,所以电脑中存有淘宝的cookie,不需要输入账号密码直接就自动登录了,然后小黑在ajax回调函数中解析了淘宝返回的数据,得到了很多人的隐私信息,转手一卖,小黑的网站终于盈利了。
  如果跨域也可以发送AJAX请求的话,小黑就真的获取到了用户的隐私并成功获利了!!!
  为了防止小黑这种黑客侵犯用户的隐私,同源政策出现了。
  同源政策:不是同协议、同域名、同端口的网页无法相互访问。

------引用自 AJAX跨域访问被禁止的原因

Springboot项目设置跨域(CORS,cross origin resource share)

  设置跨域允许请求的方式有多种,对于Springboot项目,我们可以在服务端设置允许跨域请求。只需要在Spring Context中添加一个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;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
/**
 * @author xrw
 * 跨域请求配置
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
 
    //从配置文件中读取允许访问的非本机地址
    @Value("${wedOrigin.name}")
    private  String wn;
 
    //允许跨域请求
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
 
        //遍历数组,将允许访问的地址添加进去
        String [] result = wn.split(",");
        for (int i=0;i<result.length;i++){
            corsConfiguration.addAllowedOrigin(result[i]);
        }  
      
        //这一句表示允许任何地址访问服务器
        //corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

  也可以直接在Springboot的配置文件(application.yaml)中配置允许跨域访问当前应用的源(origin)

wedOrigin:
    name: [192.168.1.1,127.0.0.1]

参考

浏览器同源策略是什么?没有同源策略会怎么样?
AJAX跨域访问被禁止的原因
配置SpringBoot项目允许跨域访问