跨域
什么是跨域
由于浏览器的同源策略限制,当一个请求
url
的协议、域名、端口三者之间任意一个与当前页面url
不同时,需要跨域才能成功访问;同源策略是浏览器的行为,是浏览器最核心也最基本的安全功能;
前端解决跨域方法
其实跨域问题都是找后端解决的;
误区:前端通过jsonp解决跨域
原生写法
1 | 1.创建一个script标签 |
ajax请求
1 | $.ajax({ |
jsonp实现原理
动态生成script标签,通过src属性来加载;
默认使用
Jsonp
进行跨域时,请求的url地址后面会自动带上一个callback=xxx
传给后端,后端需要对返回给前端的json
数据做处理,此处的callback
可通过jsonp
来自定义,xxx
可通过jsonpCallback
来自定义;jsonp
: 回调函数的参数,是与后端约定好的参数,必须与后端保持一致。不另外定义jsonp
的话,一般默认为jsonp:'callback'
jsonpCallback
: 回调函数名,用来包裹住json
数据,不另外定义的话,这个参数的值往往是随机生成的。按照上面百度搜索的
jsonp
来举例子:http://suggestion.baidu.com/su?cb=test
;其中?cb=test
中的cb
为key
,test
为value
;前端会传递一个callback参数(key)给后端,接着后端返回数据时会将这个callback参数的值(value)作为函数名来包裹住json数据,最终返给前端的就是一段js代码了;
客户端需要将函数名称传递到服务器 可以如下实现:
1 | //前端 |
1 | //后端 |
结论
- jsonp方法的实现是需要前端和后端配合的;
- jsonp只支持get请求,不支持post请求;
- jsonp有安全性问题:jsonp劫持,jsonp劫持属于CSRF漏洞;
前端通过代理解决跨域
反向代理有很多,可以用nodejs,可以用nginx,这里只介绍nginx
nginx 反向代理
由于同源策略是浏览器导致的;所以可以找一个中间代理服务器;使用这个中间代理服务器去请求后端的地址;因为服务和服务之间是不存在同源策略的,所以中间代理服务器可以请求到后端接口数据;最后前端请求中间代理服务器;
1 | //常用命令 |
- 官网下载稳定版
1 | http://nginx.org/en/download.html |
- 在根目录下,输入
cmd
打开终端
- 在终端中使用指令
start nginx
开启nginx - 在浏览器输入
localhost
,出现如下界面即代表开启成功
- 配置nginx :nginx.conf里面配置
后端的 ip +后端口 之后 最后必须有
/
,而且最后的最后必须要带上;
如果不带
;
nginx命令会不生效;
如果不带
/
;接口地址为404;
- 修改前端的请求接口
- 将前端文件放到
nginx文件的html目录下
(也可以不放,见下文的补充)
- 重新加载一下
nginx -s reload
,然后在浏览器输入localhost/myDemo.html
未经过反向代理的接口为:
补充
上面第7步中,也可以不将前端文件放到
nginx文件的html目录下
- 项目通过
vsCode
插件Live Server
起一个本地服务,地址是127.0.0.1:5500
,然后这个服务就不能关掉了,当然页面可以关;
- 修改
nginx
的配置文件
- 重新加载一下
nginx -s reload
,然后在浏览器输入localhost/myDemo.html