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

    }

}

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

相关推荐
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_1 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
许野平2 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
BiteCode_咬一口代码3 小时前
信息泄露!默认密码的危害,记一次网络安全研究
后端
齐 飞4 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod4 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。5 小时前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man5 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*6 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu6 小时前
Go语言结构体、方法与接口
开发语言·后端·golang