摘要:由于两者不同源,服务器无法在本地实现读写。这样虽然两者的没有变,但它们却由跨域变成了同源,同时是的子域。原来在发送请求时,并没有带上这一项。这是因为尽管允许跨域请求,但是还是得服从浏览器的同源策略。
今天遇到的一个问题:
在本地开发环境中,网站是在本地的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**.com是zach**.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请求的一些理解: CORS是一个w3c标准,全称为Cross-origin resoursce sharing(跨域资源共享),它允许浏览器向不用源的服务器发...
摘要:再谈异步请求语言将任务的执行模式分成两种同步和异步。通过对象及时监听完成事件,执行事件回调函数不会堵塞程序运行。新的是异步请求的另一种方案,比起其复杂糅杂的写法,能更简洁的获取到数据。提供了对和以及其他与网络请求有关的对象的通用定义。 再谈异步请求 Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。 在浏览器,耗时很长...
阅读 2821·2021-09-10 10:51
阅读 2185·2021-09-02 15:21
阅读 3168·2019-08-30 15:44
阅读 816·2019-08-29 18:34
阅读 1629·2019-08-29 13:15
阅读 3269·2019-08-26 11:37
阅读 2670·2019-08-26 10:46
阅读 1067·2019-08-26 10:26