SpringBoot使用CORS实现无缝跨域的方法实现

 更新时间:2023年10月30日 09:46:21   作者:I'm Jie  
CORS 是一种在服务端设置响应头部信息的机制,允许特定的源进行跨域访问,本文主要介绍了SpringBoot使用CORS实现无缝跨域的方法实现,具有一定的参考价值,感兴趣的可以了解一下

跨域问题

什么是跨域?

跨域(Cross-Origin Issue)的存在是因为浏览器的安全限制,它防止恶意网站利用跨域请求来获取用户的敏感信息或执行恶意操作。浏览器通过实施同源策略来限制网页在不同源之间进行资源访问或交互的情况。当一个网页的协议、域名、或端口与当前页面的协议、域名、或端口不一致时,就会发生跨域问题。

跨域问题通常涉及以下情况:

  • 跨域AJAX请求:当通过XMLHttpRequest或Fetch API发送AJAX请求时,如果请求的目标URL与当前页面的协议、域名或端口不一致,就会被认为是跨域请求。
  • 跨域资源共享(CORS)问题:在AJAX请求中,如果目标服务器没有正确配置跨域资源共享的响应头部信息,则浏览器会阻止通过AJAX获取跨域资源。
  • 跨域脚本攻击(XSS)问题:当一个网页加载了恶意脚本并在其他网页的上下文中执行时,就会发生跨域脚本攻击。

什么是浏览器的同源策略?

浏览器的同源策略(Same-Origin Policy)是一种安全机制,用于限制在浏览器中加载的网页从获取其他来源的资源或与其他来源的网页进行交互。它是为了防止恶意网站进行跨站点脚本攻击(Cross-Site Scripting,XSS)、跨站请求伪造(Cross-Site Request Forgery,CSRF)等安全威胁而设计的。

同源策略要求请求必须满足以下三个条件才能被认为是同源:

  • 协议相同:两个页面的协议必须相同(例如,都是http://或都是https://)。
  • 域名相同:两个页面的域名必须相同(例如,www.example.com 和 example.com 被视为不同域名)。
  • 端口相同:如果指定了端口号,那么两个页面的端口号必须相同。

当发生跨域请求时,浏览器会阻止以下操作:

  • 跨域的 AJAX 请求(XMLHttpRequest 或 Fetch API)。
  • 跨域的 Cookie、LocalStorage 或 IndexDB 存储访问。
  • 跨域的 DOM 操作,例如获取其他域下的元素或修改其样式。
  • 跨域的嵌入 iframe 元素之间的交互。

例如,如果一个网页在 http://example.com 的环境下运行,那么它只能与 http://example.com 或者 https://example.com 相同的协议、域名和端口的资源进行交互。如果尝试访问不同源的资源,浏览器会阻止这些操作。

如何解决跨域问题?

解决跨域问题有多种方法,可以根据具体的场景选择适合的解决方案,常用方法如下:

  • JSONP(JSON with Padding):JSONP 利用 <script> 标签没有跨域限制的特点,在目标网页中通过动态创建 <script> 标签来加载跨域的 JavaScript 文件,并在 URL 参数中传递回调函数的名称,使得目标网页将数据作为函数参数传递给回调函数。JSONP 只适用于 GET 请求。

  • CORS(Cross-Origin Resource Sharing):CORS 是一种在服务端设置响应头部信息的机制,允许特定的源进行跨域访问。通过在目标服务器的响应中设置合适的 CORS 头部,如 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 等,可以控制允许的跨域访问行为。

  • 代理服务器:通过在自己的服务器上设置一个代理接口,将跨域请求发送到目标服务器,再将获取到的结果返回给前端。前端只需要与自己的服务器进行通信,避免了直接与目标服务器跨域通信的问题。

  • WebSocket:WebSocket 协议本身不受同源策略限制,可以在浏览器和服务器之间建立持久连接,实现实时双向通信。使用 WebSocket 可以规避跨域问题。

  • postMessage API:如果页面之间需要进行跨域通信,可以使用 postMessage API,在不同窗口或 iframe 间传递消息。这种方法适用于不同窗口、不同域的页面之间的通信需求。

SpringBoot 解决跨域问题

注:环境中出现跨域问题的原因有很多,解决方法并不相同,根据具体的场景选择适合的解决方案即可。

方式一:@CrossOrigin 注解

在 SpringBoot 中,在 Controller 类上使用 @CrossOrigin 注解解决跨域问题:

@CrossOrigin
@RestController
public class LoginController {

    @PostMapping("/login")
    public User login(@RequestBody User user){
        return user;
    }

}

方式二:CorsConfig.java 配置类(常用)

在项目中创建一个名为 CorsConfig.java 配置类来启用 CORS 支持,解决跨域问题:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允许所有URL
                .allowedOrigins("*") // 设置允许跨域请求的源,这里设置为允许所有源
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
                .allowedHeaders("*") // 允许的请求头
                .allowCredentials(true) // 允许携带认证信息(如cookies)
                .maxAge(3600); // 预检请求的缓存时间(单位:秒)
    }
}

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

相关文章

  • SpringBoot中常用注解的使用合集

    SpringBoot中常用注解的使用合集

    注解 annotation一般是用来定义一个类、属性和一些方法,以便程序能够被编译处理,本文为大家整理了SpringBoot中的常用注解以及它们的使用,需要的可以参考下
    2023-07-07
  • Java中 shuffle 算法的使用

    Java中 shuffle 算法的使用

    本篇文章,小编将为大家介绍,在Java中 shuffle 算法的使用,有需要的朋友可以参考一下
    2013-04-04
  • IDEA Java win10环境配置的图文教程

    IDEA Java win10环境配置的图文教程

    这篇文章主要介绍了IDEA Java win10环境配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 如何使用JDBC实现工具类抽取

    如何使用JDBC实现工具类抽取

    这篇文章主要介绍了如何使用JDBC实现工具类抽取,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java IO流之字节输入流的使用详解

    Java IO流之字节输入流的使用详解

    这篇文章主要为大家详细介绍了Java IO流中字节输入流的使用,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-08-08
  • spring中的BeanFactory与FactoryBean的讲解

    spring中的BeanFactory与FactoryBean的讲解

    今天小编就为大家分享一篇关于spring中的BeanFactory与FactoryBean的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • springAI结合ollama简单实现小结

    springAI结合ollama简单实现小结

    本文主要介绍了springAI结合ollama简单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Java并发包线程池ThreadPoolExecutor的实现

    Java并发包线程池ThreadPoolExecutor的实现

    本文主要介绍了Java并发包线程池ThreadPoolExecutor的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 浅谈junit4单元测试高级用法

    浅谈junit4单元测试高级用法

    这篇文章主要介绍了浅谈junit4单元测试高级用法,小编觉得挺不错的,在这里分享给大家,需要的朋友可以参考下。
    2017-10-10
  • SpringMVC 域对象共享数据的实现示例

    SpringMVC 域对象共享数据的实现示例

    本文主要介绍了SpringMVC 域对象共享数据的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论