SpringBoot实现跨域的几种常用方式总结

 更新时间:2023年09月24日 10:50:53   作者:fking86  
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,或者涉及到两个不同域名的资源之间的交互,由于同源策略(Same Origin Policy)的限制,浏览器不允许跨域请求,本文小编给大家分享了SpringBoot实现跨域的几种常用方式,需要的朋友可以参考下

一、什么是跨域

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,或者涉及到两个不同域名的资源之间的交互。由于同源策略(Same Origin Policy)的限制,浏览器不允许跨域请求。同源策略规定,A网页设置的Cookie、LocalStorage和IndexDB无法被同源以外的网页读取。跨域请求会被浏览器拒绝。举个例子:- DOMAIN-A.com 和 DOMAIN-B.com 是两个不同的域名,它们之间的请求就是跨域请求。- DOMAIN-A.com/dir1 和 DOMAIN-A.com/dir2 虽然路径不同,但是域名相同,所以不是跨域。

二、跨域问题出现的原因

  1. 浏览器的同源策略(Same Origin Policy)限制了跨域请求。主要出于安全考虑,浏览器限制脚本只能读取与之同源的资源。同源指的是协议、域名、端口都相同。跨域请求会因为违反同源策略而被阻止。
  2. Cookie和本地存储也遵循同源策略。A域名下的页面无法读取B域名下的Cookie、localStorage等。
  3. 跨域JavaScript请求会报错。比如A页面请求B页面的JS文件,就会报错。
  4. 跨域DOM无法访问。A页面的JS无法获取B页面的DOM节点。
  5. 跨域数据请求需要进行CORS预检。浏览器会在正式通信之前,先进行一次HTTP查询请求,询问服务器是否允许跨源请求。
  6. iframe也受同源策略限制。A页面的iframe嵌入B页面,A页面JS无法访问iframe的DOM。
  7. 跨域图片获取限制。A页面无法获取B页面img标签的src,会报错。

三、常见的跨域请求方式

  1. JSONP:通过script标签加载JS文件来实现跨域通信。
  2. CORS:服务器端设置HTTP头,允许指定的请求来源跨域访问。
  3. postMessage:A域的window向B域的window发送消息,实现跨域通信。

四、SpringBoot实现跨域的几种方式

1.@crossOrigin 注解我们可以在Controller的方法上直接使用@CrossOrigin注解,如:

@CrossOrigin(origins = "http://domain1.com")
@RestController
public class TestController {
    @GetMapping("/test")
    public String test() {
        return "hello";
    }
}

这种方式简单适用,但是不能应对所有的跨域请求,比较局限。

2.过滤器CorsFilter我们可以注册CorsFilter跨域过滤器,如:

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://domain1.com");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

然后该过滤器会应用到所有的请求上。这种方式配置更加灵活。

3.配置类WebMvcConfigurer我们可以在WebMvcConfigurer接口的addCorsMappings()方法中添加跨域配置,如:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("http://domain1.com")
            .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
            .allowedHeaders("*")
            .allowCredentials(true);
    }
}

这也是一种比较常用的跨域解决方案。

到此这篇关于SpringBoot实现跨域的几种常用方式总结的文章就介绍到这了,更多相关SpringBoot实现跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot多文件上传实现使用postman测试多文件上传接口

    springboot多文件上传实现使用postman测试多文件上传接口

    这篇文章主要介绍了springboot多文件上传实现使用postman测试多文件上传接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java maven三种仓库,本地仓库,私服,中央仓库的配置

    Java maven三种仓库,本地仓库,私服,中央仓库的配置

    今天给大家简单介绍Maven三种仓库的配置,文中有非常详细的解释,对Java初学者很有帮助哟,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • SpringCloud全面解析@FeignClient标识接口的过程

    SpringCloud全面解析@FeignClient标识接口的过程

    这篇文章主要介绍了SpringCloud全面解析@FeignClient标识接口的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 实现一个基于Servlet的hello world程序详解步骤

    实现一个基于Servlet的hello world程序详解步骤

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
    2022-02-02
  • SpringBoot统一返回处理出现cannot be cast to java.lang.String异常解决

    SpringBoot统一返回处理出现cannot be cast to java.lang.String异常解决

    这篇文章主要给大家介绍了关于SpringBoot统一返回处理出现cannot be cast to java.lang.String异常解决的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Java实现简单登陆界面

    Java实现简单登陆界面

    这篇文章主要为大家详细介绍了Java实现简单登陆界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Spring实战之让Bean获取Spring容器操作示例

    Spring实战之让Bean获取Spring容器操作示例

    这篇文章主要介绍了Spring实战之让Bean获取Spring容器操作,结合实例形式分析了Bean获取Spring容器的相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Spring关于@Configuration配置处理流程

    Spring关于@Configuration配置处理流程

    这篇文章主要介绍了Spring关于@Configuration配置处理流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • java、freemarker保留两位小数

    java、freemarker保留两位小数

    这篇文章主要介绍了 java、freemarker保留两位小数的实现方法,然后给大家补充介绍了freemarker保留两位小数的详解,需要的朋友可以参考下
    2017-03-03
  • Java实现FTP文件上传

    Java实现FTP文件上传

    FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。本文将讲解如何用Java实现FTP文件上传
    2021-05-05

最新评论