Spring Boot - 跨域资源共享(CORS)

2020-08-18  本文已影响0人  Whyn

同源策略

在浏览器中,如果我们直接使用 AJAX 发送一个对其他网站的请求(跨域请求),默认情况下是无法获取到响应的。
这是因为浏览器内置的 同源策略 对客户端脚本的限制。

默认情况下,同源策略 只允许脚本请求同源资源,而对于请求不同源的脚本在没有明确授权的情况下,无法读取对方资源。

同源 指的是:协议域名端口 三者都相同

同源策略是浏览器内置的一个最核心,也是最基础的安全功能,它保障了用户的上网安全。

但是,如果我们确信某个非同源网站是安全的,我们希望能够对其资源进行访问,那么,就需要通过相应的机制进行跨域请求。

最常见的前端跨域请求解决方案是 JSONP,它的原理是借助script标签不受浏览器同源策略限制,允许跨域请求资源,因此可以通过script标签的src属性,进行跨域访问。如下代码所示:

// 1. 前端定义一个 回调函数 handleResponse 用来接收后端返回的数据
function handleResponse(data) {
    console.log(data);
};

// 2. 动态创建一个 script 标签,并且告诉后端回调函数名叫 handleResponse
var body = document.getElementsByTagName('body')[0];
var script = document.gerElement('script');
script.src = 'http://www.laixiangran.cn/json?callback=handleResponse';
body.appendChild(script);

// 3. 通过 script.src 请求 `http://www.laixiangran.cn/json?callback=handleResponse`,
// 4. 后端能够识别这样的 URL 格式并处理该请求,然后返回 handleResponse({"name": "laixiangran"}) 给浏览器
// 5. 浏览器在接收到 handleResponse({"name": "laixiangran"}) 之后立即执行 ,也就是执行 handleResponse 方法,获得后端返回的数据,这样就完成一次跨域请求了。

虽然 JSONP 可以完成跨域请求,但是它只支持GET请求方式,限制非常大。
于是,为了更好地支持跨域资源请求,W3C 标准就发布了一套浏览器跨域资源共享标准:CORS(Cross-origin resource sharing,跨域资源共享)

CORS(跨域资源共享)

CORS 支持多种 HTTP 请求,它其实就是定义了一套跨域资源请求时,浏览器与服务器之间的交互方式。基本的原理就是通过自定义的 HTTP 请求头来传递信息,进行验证。

浏览器中,将 CORS 请求分为两种类型:

浏览器对于 简单请求 和 非简单请求 的 CORS 处理机制不一样,具体如下:

Spring Boot 配置支持 CORS

一个很幸运的事情就是:浏览器会自动帮我们完成 CORS 相关操作,用户完全无感知。
对于开发者来说,前端代码无需修改,如果是 CORS 请求,浏览器会自动帮我们加上相应的请求头进行请求...

因此,实现 CORS 通信需要配置的就只是服务器端。

下面介绍下在 Spring Boot 中配置 CORS 通信,主要介绍几种常用的配置方法,如下所示:

附录

参考

上一篇下一篇

猜你喜欢

热点阅读