Web | Springboot解决跨域

深入讲解:cors

一、跨域是什么

当我们使用AJAX请求其他域名(即不是同协议 同域名 同端口)的情况下,会出现拒绝访问的情况。
比如:你的网站域名是localhost:8888,想要访问localhost:6666中的内容浏览器是不允许的。


二、为什么跨域请求获取不到数据

我们浏览器有同源政策,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问。
但如果是form表单中则是可以的,比如
form表单
localhost:8888中的html页面,可以访问到:

<button id="myButton">点我</button>
<form action="localhost:8888/" method="get">
   <input type="password" name="password">
   <input type="submit" value="提交">
</form>

ajax
不可以访问到:

request.open('GET', 'localhost:8888/')

原因:
原页面用 form 提交到另一个域名之后,原页面的脚本无法获取新页面中的内容,所以浏览器认为这是安全的;
AJAX 是可以读取响应内容的,因此浏览器不能允许你这样做。如果你细心的话你会发现,其实请求已经发送出去了,你只是拿不到响应而已,下面会详解。
所以浏览器这个策略的本质是,一个域名的 JS ,在未经允许的情况下,不得读取另一个域名的内容。但浏览器并不阻止你向另一个域名发送请求。

在这里插入图片描述


三、springboot解决方案

服务端来解决跨域的本质就是在响应头中加入允许跨域的信息Access-Control-Allow-Origin:允许跨域访问本服务的请求地址,让浏览器允许跨域

3.1 方式一

在方法或类上加 @CrossOrigin(origins="url")
url表示支持跨域访问本服务的其它地址。

3.2 方式二

进行额外配置

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/**
     * 跨域支持配置
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") //指定允许跨域的接口
                .allowCredentials(true)
                .allowedHeaders("*")//指定允许对本服务跨域访问的地址的请求头信息
                .allowedOrigins("*") //指定允许对本服务跨域访问的地址
                .allowedMethods("*") //指定本服务中支持跨域的方法类型,如get、put。。。。
                .maxAge(30 * 1000); // put会在正式发送请求之前,发一个探测请求,看是否支持跨域,这个就是设置探测请求有效时间,在有效时间内如果出现跨域,可以不用发送探测请求。
        //后端设置跨域逻辑,响应跨域信息,告诉浏览器允许跨域请求
    }
}

3.3 方法三

/**
 * 跨域支持
 */
@Configuration
public class CorsConfig {
    private static final String MAX_AGE = "18000L";

    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

3.4 方法四

@Configuration
public class WebConfig {

    /**
     * 跨域请求支持
     */
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("*")
                        .allowedMethods("*").allowedHeaders("*")
                        .allowCredentials(true)
                        .exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L);
            }
        };
    }
}

其它方法详见:spring官方文档:CORS support in Spring Framework

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值