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

    }

}

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

相关推荐
0zxm44 分钟前
06 - Django 视图view
网络·后端·python·django
m0_7482571844 分钟前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端
小_太_阳2 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
搬码后生仔3 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
凡人的AI工具箱3 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
Lx3524 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas
小池先生4 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
百罹鸟4 小时前
【vue高频面试题—场景篇】:实现一个实时更新的倒计时组件,如何确保倒计时在页面切换时能够正常暂停和恢复?
vue.js·后端·面试
小蜗牛慢慢爬行5 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate