这个问题的回答其实没有给出直接性的帮助,甚至回答的有点奇怪,可是帮我打开了思路。
出于多种考虑,放弃了使用相似WordPress这种现成博客解决方案,准备本身搭建一个博客系统,技术选型为:后端:Flask,前端:Vue。登陆状态管理放弃cookie,采用token。开发进行到路由保护处时出现了CORS的问题,具体情形是Vue将从后台获取的token添加到HTTP请求的header中,调用相应接口时出现跨域。前端
在这次跨域出现前实际上已经在Flask经过flask_cors配置了跨域解决方案,所以跨域的产生是让我十分不解的,又因为问题比较奇特在搜索引擎中没有找到很好的解决方案(也多是我不知道怎么描述,没有搜出来),所以本身从新研究能够一下跨域,又有了一些新收获。ios
相信使用先后端分离的开发者在开发之初就会碰到跨域的问题,跨域的解决方案有不少种,我选择经过后台解决。json
跨域是浏览器同源策略致使的问题,网上相关文章不少,此处不赘述。备注一点:postman不会产生跨域。
Flask解决跨域的方案很是简单,如下代码便可完成。flask
from flask_cors import CORS CORS(app,supports_credentials=True @app.after_request def after_request(resp): resp = make_response(resp) resp.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8080' resp.headers['Access-Control-Allow-Methods'] = 'GET,POST' resp.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type' return resp
配置完成后,一直也没有没有出过问题,所以也就没有去进一步了解其配置的含义,直到这一次被卡住,让我不得不去了解一下跨域我究竟配置了什么东西?axios
其实这个问题的关键点就在于那三条配置:Access-Control-Allow-Origin
、Access-Control-Allow-Methods
、Access-Control-Allow-Headers
.
他们到底表明什么含义?segmentfault
首先Access-Control-Allow-Origin
,字面上的意思,配置这个能够容许相应的源来访问后台资源,网上大多在此处的写的是*
,也即容许全部源,这样很不安全,因为我此处是本地开发阶段,Vue的启动端口是8080,因此我写的是http://127.0.0.1:8080
,根据你的开发须要改为本身须要的三元组便可。后端
其次Access-Control-Allow-Methods
,也是字面上的意思,容许用的HTTP的Method有哪些,GET,POST是最多见的,此处只写了两个,若是你须要使用其余Method,在这里要写进来,不然也会会出现跨域问题。跨域
以上两个配置都没有问题,问题在了最后一部分:浏览器
Access-Control-Allow-Headers
,和上面两个同样,字面的意思,之因此是她出问题了,是由于咱们在前端给HTTP请求添加了一个自定义的字段token
,而这不在许可范围内(许可的只有x-requested-with
和content-type
),所以被断定为了避免符合同源策略的非法请求,因此咱们只须要将自定义的header添加进去便可。答案已经出来了。安全
继续挖一下,这个字段的两个含义分别仍是什么?x-requested-with
,content-type
.
x-requested-with
是一个用来判断客户端请求是否由Ajax发起的,因此和Axios有什么关系?答案是:没有关系...能够直接删了。贴上这段代码的人或者是默认了发起请求使用的是Ajax,又或者没有分析字段含义,因此很直接贴了这段代码,可是对于使用Axios的开发者来讲,这个字段不是必然的。
content-type
: 指明POST请求的数据格式以及编码方式。数据格式最多见的莫过于josn,其形式以下:application/json
在后端打印出POST请求的HTTP Header,就会发现有下面这条和数据。
Content-Type: application/json;charset=UTF-8
在Access-Control-Allow-Headers
中添加上自定义的header名称,总体以下:
from flask_cors import CORS CORS(app,supports_credentials=True @app.after_request def after_request(resp): resp = make_response(resp) resp.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8080' resp.headers['Access-Control-Allow-Methods'] = 'GET,POST' resp.headers['Access-Control-Allow-Headers'] = 'content-type,token' return resp
其实直接删掉
Access-Control-Allow-Headers
这条配置,也能解决问题,可是枚举出全部固定情形固然是更安全的。
要获取更多Haytham原创文章,请关注公众号"许聚龙":