【填坑向】后端如何处理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 "";

    }

}

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

相关推荐
import_random20 分钟前
[macos]rocketmq(安装)
后端
程序员小假39 分钟前
你会不会使用 SpringBoot 整合 Flowable 快速实现工作流呢?
java·后端
明月与玄武1 小时前
快速掌握Django框架设计思想(图解版)
后端·python·django
陪我一起学编程1 小时前
关于ORM增删改查的总结——跨表
数据库·后端·python·django·restful
南囝coding1 小时前
这个 361K Star 的项目,一定要收藏!
前端·后端·github
虎鲸不是鱼2 小时前
Spring Boot3流式访问Dify聊天助手接口
java·spring boot·后端·大模型·llm
onlooker66662 小时前
Go语言底层(五): 深入浅出Go语言的ants协程池
开发语言·后端·golang
武子康2 小时前
Java-46 深入浅出 Tomcat 核心架构 Catalina 容器全解析 启动流程 线程机制
java·开发语言·spring boot·后端·spring·架构·tomcat
寻月隐君2 小时前
Solana 开发实战:Rust 客户端调用链上程序全流程
后端·rust·web3
丘山子3 小时前
别再滥用 None 了!这才是 Python 处理缺失值的好方法
后端·python·面试