浏览器跨域请求之credentials
-时间起源-
前段时间,需要弄个简单的网站出来,访问远程的api服务。
我是这么做的。首先是在搭建一个nodejs服务来运行前端页面。在我请求登录的时候,能成功返回相应的成功信息。然后,当我再次请求读取别的接口的时候,返回的信息确实提示我尚未登录。此时此刻,我一脸蒙逼。明明我已经登陆了啊。后来偶然得知这是因为浏览器的机制问题。
-初步解决-
大概的意思是,默认情况下,标准的跨域请求是不会发送cookie等用户认证凭据的。所以,当你再次访问远程api的时候,cookie是不会被带上的,于是乎,服务器理所当然地认为你还没有登录。MDN上的简单介绍 credentials 。用XMLHttpRequest请求的时候,我们需要设置属性 withCredentials=true ;
- var xhr = new XMLHttpRequest();
- xhr.open('GET', 'http://www.xxx.com/api');
- xhr.withCredentials = true;
- xhr.onload = onLoadHandler;
- xhr.send();
这样一来,cookie相关信息就会被带上了。
需要注意的是,当这个属性为true的时候,远程服务器也要作相应的处理。在响应头那里设置 Access-Control-Allow-Credentials: true 。如果没有这个设置的话,浏览器就会报错。
-引入新的问题-
然后,还有一点需要说明的是,当服务器设置了Access-Control-Allow-Credentials: true之后,Access-Control-Allow-Origin就不能设置为 * 了(别问我为什么知道,我也说不清楚,可能是考虑到安全问题吧)。这么一来,那就陷入一个困境了:远程服务就是应该设置为允许浏览器跨域访问的啊,这个属性不能这么设置的话,应该怎么搞呢?于是我查啊查,搜啊搜,终于把这个问题完美解决了。
-再度解决-
Access-Control-Allow-Origin的作用在于,允许特定白名单用户(浏览器)访问我这个接口。当设置为 * 的时候,表示所有用户都能访问。如果值为 'http://xxx.com',则表示只接受来自这个域名的请求,其他的一律拒绝。而我们想要的效果就是想设置为 * 。自从用了Access-Control-Allow-Credentials: true,就不能设置Access-Control-Allow-Origin:'*'了。所有,我们可以换一种思路,当a用户进来的时候,我们设置a用户为白名单就好,同理b用户也是。也就是说,谁访问,我就设置谁为白名单。当浏览器进行跨域请求的时候,服务器能获取其相应的请求头,其中一个是 Origin 属性,表示请求的域。我们只要设置这域为白名单就好。每种服务器语言的设置方法可能都不一样,但原理是一样的。 大概如下
- responce.set('Access-Control-Allow-Origin', request.get('origin'));
好。ok了。
--------------------------------------------------------------
note: 上面的是使用原生的ajax请求,实际上很多人都选择诸如jquery这类框架。我之前是在beforeSend方法那里设置 xhr.withCredentials=true。然后悲剧地发现根本不能达到我的预期效果。其实,不是这么用的。应该是作为一个属性,而不是方法里面设置。与data属性并列设置就好。所以看起来是这样子的
- function func() {
- $.ajax({
- type: "GET",
- dataType: "json",
- xhrFields: {
- withCredentials: true // 要在这里设置
- },
- url: 'https://xxx.com/api/login',
- success: function (data) {
- },
- beforeSend: function (xhr) {
- // 下面的设置无效
- // xhr.withCredentials = true;
- },
- error: function (err) {
- alert(JSON.stringify(err))
- }
- })
- }
好了,故事完了。
浏览器跨域请求之credentials的更多相关文章
- MediaElement.js之浏览器跨域请求视频播放
浏览器跨域问题一直以来都是作为前端开发人员常见的问题,所以今天学习了下如何使浏览器跨域请求资源 需要了解的知识 -域(主域,子域,什么是跨域) 简单来说由于浏览器同源策略,凡是发送请求url的协议(h ...
- [1.6W字] 浏览器跨域请求限制的详细原理分析&寻找一种最简单的方式实现XHR跨域(9种方法, 附大招可以纯前端实现跨域!)
Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...
- [1.6W字]浏览器跨域请求的原理, 以及解决方法(可以纯前端实现) #flight.Archives011
Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...
- 使用nginx实现浏览器跨域请求
跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域? 假如你是百度开发人员, 在百度页面去请求 ...
- 【原】fetch跨域请求附带cookie(credentials)
HTTP访问控制 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 解决跨域的方式有很多种,本文介绍" ...
- Chrome浏览器允许跨域请求配置
最近有个做数据标注的任务,但是标注平台是别人公司的,他们又不愿意对平台进行升级改造: 其实要改的地方也很简单,就是对页面做一些处理,做一些脚本控制. 没办法,做了个 iframe 给她嵌入到我们自己的 ...
- chrome实现全浏览器跨域ajax请求
如图,在chrome快捷方式上打开属性栏,在‘目标’栏加上后缀--disable-web-security --user-data-dir.即可实现在此浏览器上所有网页的跨域请求.
- 浏览器同源策略,跨域请求jsonp
浏览器的同源策略 浏览器安全的基石是"同源政策"(same-origin policy) 含义: 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这 ...
- 爬取斗图网图片,使用xpath格式来匹配内容,对请求伪装成浏览器, Referer 防跨域请求
6.21自我总结 一.爬取斗图网 1.摘要 使用xpath匹配规则查找对应信息文件 将请求伪装成浏览器 Referer 防跨域请求 2.爬取代码 #导入模块 import requests #爬取网址 ...
随机推荐
- Python基础知识:测试代码
1.Python标准库中的模块unittest提供了代码测试工具. 单元测试用于核实函数的某个方面没有问题: 测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求. 通俗的理解 ...
- 【PAT】B1077 互评成绩计算(20 分)
录入成绩,直接将所有同学给的分数相加,排序,减去最大和最小 省去了遍历一次 注意四舍五入 #include<cstdio> #include<string.h> #includ ...
- Numbers
Encoding style, data structure, more content about the list, use the list as a stack, use the list a ...
- 卷积运算的本质,以tensorflow中VALID卷积方式为例。
卷积运算在数学上是做矩阵点积,这样可以调整每个像素上的BGR值或HSV值来形成不同的特征.从代码上看,每次卷积核扫描完一个通道是做了一次四重循环.下面以VALID卷积方式为例进行解释. 下面是pyth ...
- 获取请求Url
/// <summary> /// 获取请求Url /// 例:http://www.text:1234 /// </summary> /// <returns>& ...
- Scala 上下文界定
上下文界定的类型参数形式为T:M的形式,其中M是一个泛型,这种形式要求存在一个M[T]类型的隐式值: /** * 上下文界定 */ @Test def testOrdering_Class_Conte ...
- Python基础视频
链接:https://pan.baidu.com/s/1oPiS32sWVysuVAivtdFKnQ 密码私聊我
- Spring Boot + Mybatis多数据源和动态数据源配置
文章转自 https://blog.csdn.net/neosmith/article/details/61202084 网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种 ...
- 617. Merge Two Binary Trees
https://www.cnblogs.com/grandyang/p/7058935.html class Solution { public: TreeNode* mergeTrees(TreeN ...
- MP实战系列(三)之实体类讲解
首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomido ...