资讯专栏INFORMATION COLUMN

Cookies with CORS

chenjiang3 / 862人阅读

摘要:由于两者不同源,服务器无法在本地实现读写。这样虽然两者的没有变,但它们却由跨域变成了同源,同时是的子域。原来在发送请求时,并没有带上这一项。这是因为尽管允许跨域请求,但是还是得服从浏览器的同源策略。

今天遇到的一个问题:

在本地开发环境中,网站是在本地的Express服务器上跑的,地址是localhost:8000(127.0.0.1:8000),而网站里的所有AJAX请求的服务器地址则是10.10.5.240:8080。由于两者不同源,服务器无法在本地实现读/写cookie。

我们的目标是让服务器在本地可以读写cookie:

1、 origin包括scheme, host, port,所以首先第一步是把本地网站端口改成8080.

2、 为了让两者同源,我们可以修改hosts。

首先在控制台中输入sudo vim /etc/hosts,打开后输入i可以进入编辑模式。在空白处添加两条新的host。

127.0.0.1       a.zach**.com
10.10.5.240     zach**.com

添加完后,按Esc退出编辑模式后,再输入:wq保存更改退出。

左边是ip,右边是对应的域名地址。当我们在浏览器中输入一个域名时,浏览器首先得把域名地址转化成对应的ip地址。

所以添加了这两条新的host后,我们可以用a.zach**.com:8080来打开网站,同时所有AJAX请求地址换成zach**.com:8080。这样虽然两者的ip没有变,但它们却由跨域变成了同源,同时a.zach**.comzach**.com的子域。

这样一来,当我们在父域下存入cookie后,访问子域也是可读取到这个cookie的。

3、 随意打开一个ajax地址,在控制台写入cookie。要注意的是一定要加上domain=.zach**.com;path=/, 否则子域是读不到该cookie的。

document.cookie = "userId=45fdaf1541fdfds4a;domain=.zach**5078.com;path=/";

做完上面三步以后,我们已经能够在本地的cookie中读取到userId,但是所有的ajax请求还是返回401。原来在发送ajax请求时,Request Cookies并没有带上userId这一项。

这是因为尽管CORS允许跨域请求,但是cookies还是得服从浏览器的同源策略。

4、给XHR对象设置withCredentials属性。因为项目有用jQuery,所以下面可以直接在ajaxset中全局统一设置。

     $.ajaxSetup({
       xhrFields: {
          withCredentials: true
       }
     });

5、最后修改服务器的设置。
加上这一句Access-Control-Allow-Credentials:true。同时由于设置了credentials,就不能用*来设置Origin了 Access-Control-Allow-Origin:*, 而应该相应的改成Access-Control-Allow-Origin: a.zach5078.com:8080, 记得加上端口号。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87719.html

相关文章

  • http请求 header里General Response Request 里面参数的含义

    摘要:对于简单请求,基本就是在请求中自动在头信息中添加一个字段,例如这表示同意的请求。非简单请求会在正式通信前增加一次查询请求,成为预检。必要字段表示服务器支持的所有跨域请求方法,只要浏览器使用的请求方法包含在内即可通过。 关于http请求的一些理解: CORS是一个w3c标准,全称为Cross-origin resoursce sharing(跨域资源共享),它允许浏览器向不用源的服务器发...

    Ryan_Li 评论0 收藏0
  • 异步请求与Fetch

    摘要:再谈异步请求语言将任务的执行模式分成两种同步和异步。通过对象及时监听完成事件,执行事件回调函数不会堵塞程序运行。新的是异步请求的另一种方案,比起其复杂糅杂的写法,能更简洁的获取到数据。提供了对和以及其他与网络请求有关的对象的通用定义。 再谈异步请求 Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。 在浏览器,耗时很长...

    vibiu 评论0 收藏0
  • 前端跨域大总结

    摘要:跨域正确的打开方式经过对同源策略的了解,我们应该要消除对浏览器的误解,同源策略是浏览器做的一件好事,是用来防御来自邪门歪道的攻击,但总不能为了不让坏人进门而把全部人都拒之门外吧。 跨域这两个字就像一块狗皮膏药一样黏在每一个前端开发者身上,无论你在工作上或者面试中无可避免会遇到这个问题。为了应付面试,我每次都随便背几个方案,也不知道为什么要这样干,反正面完就可以扔了,我想工作上也不会用到...

    Wuv1Up 评论0 收藏0
  • Fetch()

    摘要:常见的坑接收到表示错误的状态码时,返回的不会被标记为即使状态码为或。会将状态标记为但返回值但属性设置为。网络故障或请求被阻止才会标记为。原始请求请求使用箭头函数获取一个文件,并打印到控制台。参数接受第二个可选参数,控制不同配置的参数。 Fetch()提供了一种方式进行跨网络异步请求资源的方式,用于访问和操作HTTP管道的部分,比如:请求和相应。 fetch常见的坑: 接收到表示错误...

    lakeside 评论0 收藏0
  • Fetch API

    摘要:现在有很多优雅的包装,但是这远远不够。一个实例代表了一个的请求部分。一旦创建,它所有的属性都是只读的。处理基本的返回不是所有的接口都返回格式的数据,所以还要处理一些类型的返回结果。最后很好用,但是现在还不允许取消一个请求。 Fetch API 一个隐藏最深的秘密就是AJAX的实现底层的XMLHttpRequest,这个方法本来并不是造出来干这事的。现在有很多优雅的API包装XHR,但是...

    princekin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<