本文将要讲什么
什么是cors跨域、细节
cors跨域带cookie的细节
结合 demo(zhiguangphoenix/cors-demo)
前提知识和背景
- 知道什么是跨域,什么是同源策略,跨域的限制等等
- 知道除cors外常见的跨域实现
前段时间在工作中接了一个小的后端服务的需求,做的过程中可能需要接入跨域带cookie的方案,于是深入的了解了一下cors跨域带cookie的细节,之前只是比较粗浅的了解。
cors跨域
先运行项目,通过本地的两个端口来模拟两个不同的域,打开http://127.0.0.1:8080/注意:
- 下图的script.src地址是在向另一个域种cookie,应该设置为本机的IP地址,如果设置为127.0.0.1,无法看到跨域带cookie的效果
![cdc0c7666676ce588a6d4cf42c5efbba.png](https://i-blog.csdnimg.cn/blog_migrate/8841ca44d1fe0032190828b342719766.png)
- 下图跨域带cookie的ajax请求URL不能再向127.0.0.1发起,因为host一样的话会带上cookie,看不出来效果,所以在fe.html中改为本地IP地址即可.
![328adce46cbe6d9998ec0ae18516b5b7.png](https://i-blog.csdnimg.cn/blog_migrate/9ffefe8e63d7cad3f4deb2eb678b07ff.jpeg)
npm run start:be;npm run start:fe
![c9c9a38f4138cc125565ed7dca92e992.png](https://i-blog.csdnimg.cn/blog_migrate/5d28a29c246708e21281639735b60ccc.jpeg)
分别点击跨域简单请求和跨域非简单请求(request中加了header:X-header=notsimple),控制面板network会看到:
跨域简单请求发送了一个请求(GET):
![3e33c6ede9e8c687555032f3963e2301.png](https://i-blog.csdnimg.cn/blog_migrate/42b78dfa59fddebd28a434c1d4bbd87b.jpeg)
跨域非简单请求发送了两个请求(OPTIONS和GET):
![37af3461e6ad812fab466ee370da287e.png](https://i-blog.csdnimg.cn/blog_migrate/23fcc659e3ca3776e4a26d866c7aed9a.jpeg)
![be199ab02dc1086359585bc4e9b3057b.png](https://i-blog.csdnimg.cn/blog_migrate/cf1b01d5fea6932045d2224536eee418.jpeg)
看下Wikipedia怎么说:cors跨域(wikipedia)是一种跨域的解决方案,具体来说分为两种,简单请求和非简单请求。
![35b9e9f87ae6e3f5da59ce035737705c.png](https://i-blog.csdnimg.cn/blog_migrate/6abe8ef69e4cf5d56a20c223913deb74.jpeg)
![d273316a6801c5f0ad8959ee196f7a1b.png](https://i-blog.csdnimg.cn/blog_migrate/92019569000b4469db43a90398025591.jpeg)
简单请求:请求方法是简单方法且请求头是简单头
- 简单方法:GET、HEAD、POST
- 简单头:
Accept
,Accept-Language
,Content-Language
或Content-Type
是application/x-www-form-urlencoded
,multipart/form-data
或text/plain
对于简单请求:只有一次请求
request发一次请求:
Origin=发起请求域的域名
response返回:
Access-Control-Allow-Origin: * // 此时暂时设为*
对于非简单请求:一次preflight请求和一次真正的请求
request发一次preflight请求(OPTIONS):
Access-Control-Request-Headers: x-header //自定义的头部
Access-Control-Request-Method: GET // 接下来真正请求的method
response返回:
Access-Control-Allow-Headers: x-header
Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
Access-Control-Allow-Origin: *
request发一次真正的请求:
X-header: notsimple
Origin=发起请求域的域名
response返回:
Access-Control-Allow-Origin: *
cors跨域带cookie
![dc0770e1bddaa8a7fd303d8e7272c0ae.png](https://i-blog.csdnimg.cn/blog_migrate/ead8ad5ffb7bcfde72049fb6d7022d94.jpeg)
点击跨域带cookie会看到控制台报错:
![3306faf22ebe620ed2738457bc36d6fe.png](https://i-blog.csdnimg.cn/blog_migrate/5f413b11afdfc07780883c4bdd369252.png)
错误提示:请求带有withCredentials=true时,response的Access-Control-Allow-Origin不能为*
代码server.js中修改如下,然后点击跨域带cookie按钮
![fab9ba8c4961716556808f3d81b34e9f.png](https://i-blog.csdnimg.cn/blog_migrate/5b71d18842d328878a7d4c2d881ffcc2.png)
浏览器控制台报错如下:
![832986de92cc0e41ca71b251d1958edf.png](https://i-blog.csdnimg.cn/blog_migrate/6c181828875f544a0baf794eea9565d6.png)
错误提示:withCredentials=true的时候response的Access-Control-Allow-Credentials必须为true
代码server.js中做修改如下,然后点击跨域带cookie按钮
![4a2bc3803c61a0f22cd11471f9ce9ad7.png](https://i-blog.csdnimg.cn/blog_migrate/8b407e5856405aa1906c6cac26a62a5a.png)
这次成功返回了:
![5db994e966261e3772baf3d586ebd742.png](https://i-blog.csdnimg.cn/blog_migrate/04e2fe0276b732a5f7f391864b11e0df.jpeg)
总结一下,跨域带cookie细节如下:
ajax request设置withCredentials=true
response设置headers:
Access-Control-Allow-Origin=发起请求的origin
Access-Control-Allow-Credentials: true
后记
前端多了解后端,更好更清晰
欢迎关注我的公众号,前端亚古兽,做前端,不止于做前端。
![2de4d118fc38afb087747d59a749475b.png](https://i-blog.csdnimg.cn/blog_migrate/a6b57d2fe9cb534f0b8efb93db2332cb.jpeg)