Node跨域问题AccesstoXMLHttpRequestathttp:localhos。。
二手车转让协议。
⼈不可能踏进同⼀条河流,我可以⼀天在同⼀个问题上摔倒两次。
这次是跨域问题,都是泪,教程提供的服务端代码虽然配置了⽂件,但是依然是没有解决跨域问题,依然报错 Request header field content-type is not allowed by Aceess-Control-Allow-Header in preflight respon.
整个跨域代码全部注释掉换上
畅游海底世界app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-R
equested-With , yourHeaderFeild');
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;chart=utf-8");
next();
槟榔的功效});
问题解决。
————————————————————————————
2020.12.22补⼀次更新,这个问题随着⼯作时间的增长,现在过去⼏个⽉了,对跨域的理解也更加深⼊。
⼀.问题产⽣的原因
1.什么是同源?
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是⼀种约定,它是浏览器最核⼼也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的⼀种实现。同源策略会阻⽌⼀个域的javascript脚本和另外⼀个域的内容进⾏交互。所谓同源(即指在同⼀个域)就是两个页⾯具有相同的协议(protocol),主机(host)和端⼝号(port)。
那么问题来了,后台是⾃⼰(⽐如⾃⼰搭的NODE后台,或者请求本地资源,也报了这个跨域的错误),此时怎么解决呢?刚好我也遇到了这个问题,其实很简单,仔细理解⼀下跨域就知道问题在哪⾥了,接下来继续往下⾯看。
⾸先,同源限制了哪些条件?
当前页⾯url被请求页⾯url是否跨域原因
下⾯来谈谈解决⽅案
第⼀,在我们搭建NODE的后台框架的时候,如果没有配置跨域允许,是会阻挡跨域请求的。
解决办法为,增加⼀个中间件处理(此处默认使⽤了EXpress或Koa框架的后台),在后台代码中,加⼊我之前写的那段代码就好了
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;chart=utf-8");
next();
});
这段代码,⼤概就是增加了允许访问后台的⼀些请求头(header)、⽅法(PUT,POST,GET,DELETE,OPTIONS)等
第⼀句则是意思为允许所有origin源访问(此处还有⼀坑,我后⾯再描述)
如果后台这样配置了却依然没有解决的话,就仔细检查⼀下前后端是否在Origin、Headers、Methods、Content-Type的配置上是不是有不⼀样的地⽅,以ajax请求为例,例如他错误提⽰为⽂件类型不允许,那么就需要前端在请求中加⼊"Content-Type"这⼀项配置,与后台配置相吻合,其他的也是⼀样。
以上,⾃⼰搭建的NODE跨域问题就基本解决了,此外node⾥有⼀个第三⽅模块:cors,可以直接npm install ⼀下,然后引⼊、使⽤,只⽤两句代码就可以简单实现跨域允许,就省去上⾯⼀⼤段代码了。
第⼆,我⾃⼰根本就没有搭什么后台,我也没有访问后台呀,我就是请求我⾃⼰本地的资源也报这个错误了!是为什么呢?
这个坑我遇到了,原因也是在对同源政策的理解上,众所周知,我们本地的地址有好多种表达⽅式,localhost,127.0.0.0,以及⾃⼰在局域⽹中的IP地址,这就有3个了,如果加上公⽹IP那就是四个了,但是这四个地址之间也是会发⽣跨域的!例如我在代码中写的请求地址为:localhost/,但是我在局域⽹中运⾏了,浏览器的IP地址为10.0.0.1/index.html,此时localhost和10.0.0.1也是会发⽣跨域的,不信你把10.0.0.1换成localhost试试。
志气是什么意思————————————————————————————
2021-8-14 补更新
前两天使⽤axios进⾏请求时,⼜遇到了跨域的问题,跨域的问题⼜出现了,究其原因是在axios中就会对get请求的整个url进⾏encodeURI,导致有些get⽅法不能传[]
场景:
柿子的营养其他请求接⼝都正常,GET请求参数中,传参了⼀个空的数组,导致跨域,仔细对⽐,空数组在经过axios未经过编码。
单身承诺书
解决⽅法:
在axios中间件处理中加⼊以下代码:
近日是什么意思quest.u(
config => {
let url = config.url
档案中心// get参数编码
if (hod === 'get' && config.params) {
url += '?'
let keys = Object.keys(config.params)
for (let key of keys) {
url += `${key}=${encodeURIComponent(config.params[key])}&`
}
url = url.substring(0, url.length - 1)
config.params = {}
}
config.url = url
return config
},