【填坑向】后端如何处理CORS跨域问题

跨域

首先,什么是跨域?

  • 域: 是指浏览器不能执行其他网站的脚本
  • 同源: 在同一个域,即两个页面具有相同的协议
  • 跨域: 它是由浏览器的 同源策略 造成的,是浏览器对JavaScript实施的安全限制,协议、主机、端口号的不同都会导致跨域(一般来讲理只要请求的URL有协议(http/https)、IP地址、端口号的不同,就可以视为"跨域")

跨源资源共享

跨源资源共享 (CORS) 是一种基于 HTTP 标头的机制,它允许服务器指示浏览器应允许从其加载资源的源(域、方案或端口)以外的任何源。 CORS 还依赖于一种机制,浏览器通过该机制向托管跨源资源的服务器发出"预检"请求,以检查服务器是否允许实际请求。 在该预检中,浏览器发送指示 HTTP 方法的标头和将在实际请求中使用的标头。

CORS(Cross-origin resource sharing 跨域资源共享) 机制是W3C 制定的,是一种解决"跨域"的方案。"跨域"限制其实是浏览器自带的安全机制,只有在浏览器上 发生跨域请求操作时,浏览器就会自动抛出上面的错误。因此只有在使用浏览器访问时才会碰到由于跨域问题导致的异常(像后端同学常用的Postman一类的工具是没有这个限制🚫的

简单来讲,跨域其实是一种机制,是用于解决浏览器的同源策略所导致的跨域访问限制问题的

那么问题又来了:什么是同源策略?

同源策略是浏览器的一种安全机制,它限制了从一个源(协议、域名、端口)加载的文档或脚本如何与来自另一个源的资源进行交互。

就是当一个网页的脚本试图访问另一个源的资源时,如果不符合同源策略的要求,浏览器会阻止该请求。 而 CORS 则通过在服务器端设置响应头,来告诉浏览器该请求是否被允许以及允许的方式。当浏览器发起跨域请求时,服务器会根据请求的来源和预定义的规则,在响应中添加相应的 CORS 头信息(比如 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 等等)。而浏览器就会根据这些头信息来决定是否允许该跨域请求以及如何处理响应数据。

我们举个栗子,如果服务器设置 Access-Control-Allow-Origin: http://example.com,表示只允许来自 http://example.com 的请求访问该资源。如果设置为 Access-Control-Allow-Origin: *,则表示允许任何源的请求访问该资源(这种方式可能存在安全风险,适用需谨慎)。

安全就会带来一些麻烦,虽然这种机制增加了访问数据的安全性,但同时,偶尔也会限制我们正当的访问需求,因此,又是我们不得不让处理一些跨域带来的问题。

哈哈,前提铺垫了这么多,其实解决方式很简单,在controller层加一上注解@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*", methods = {})即可,具体如下:

java 复制代码
@RestController

@Api(value = "Controlloer", tags = "控制台")

@RequestMapping(value = "/data", produces = "application/json")

@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*", methods = {})

public class FeiFeiController {

    @Autowired

    private FeifeiService feifeiService;



    @RequestMapping(value = "/deal", method = RequestMethod.POST)

    public String writeToFile(@RequestBody RequestData requestData) {

        System.out.println(requestData.getCountry());

        feifeiService.write2Excel(requestData);

        return "";

    }

}

完结撒花✿✿ヽ(°▽°)ノ✿~~~~

相关推荐
不会kao代码的小王5 分钟前
突破局域网!OpenObserve,数据观测随时随地
linux·windows·后端
缺点内向7 分钟前
如何在 C# 中高效的将 XML 转换为 PDF
xml·后端·pdf·c#·.net
Arva .9 分钟前
Spring Boot自动配置原理
java·spring boot·后端
风象南14 分钟前
SpringBoot ThreadLocal 父子线程传值的几种实现方式
后端
Victor35618 分钟前
Redis(162)如何使用Redis实现消息队列?
后端
Victor35623 分钟前
Redis(163)如何使用Redis实现计数器?
后端
KD24 分钟前
数据密集型应用系统设计——面试总结版
后端
i***13249 小时前
Spring BOOT 启动参数
java·spring boot·后端
IT_Octopus9 小时前
(旧)Spring Securit 实现JWT token认证(多平台登录&部分鉴权)
java·后端·spring