1.跨域
跨域问题:只有在前端的ajax和后台交互的过程中才会存在
当我们使用ajax从一个url向另外一个url发送请求的时候,只要两个url的协议、域名、端口号有任何一个不一样,就构成跨域
1.1 JSONP
1.1.1 JSONP介绍
JSONP:是使用script标签向服务器发送请求的一种方式,然后在服务器中客户端返回了一段js脚本,客户端接收到这个js脚本之后就会执行该脚本了。
在使用JSONP来解决跨域请求问题的时候,需要服务端的配合。
JSONP只能够发送GET请求。
JSONP和AJAX有关系吗? 没有任何关系
//通过script标签是可以发送请求
1 2 3
| var script = document.createElement('script') script.src = 'http://localhost:8888/test' document.body.appendChild(script)
|
//获取script标签请求的结果:在服务器返回一段js脚本,客户端接收到js脚本之后会立刻执行该脚本
function test(msg){
console.log(msg)
}
1 2 3 4 5 6 7 8
| app.get("/test",(req,res)=>{ res.header("content-type","application/javascript") var person = { name:"kk", age:"19" } res.send(`test(${JSON.stringify(person)})`) })
|
1.1.2 ajax中jsonp的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| ajax的dataType可以指定怎么处理服务器响应给客户端的数据
text/xml : 对服务器的相应结果不做任何处理 html : 服务器给客户端响应了一个页面代码,页面代码中script会在代码拼接到dom执行 json : 会调用JSON.parse()来解析服务器的响应结果 script : 服务器给客户端响应了js脚本,客户端接收到js脚本之后立马执行 jsonp :客户端给服务器发送jsonp请求,服务器返回了一段js脚本
$.ajax({ type:"get", url:"http://localhost:8888/test2", dataType:"jsonp", success:function(msg){ console.log(msg); } })
app.get("/test2",(req,res)=>{ res.header("content-type","application/javascript") var functionName = req.query.callback; var person = { name:"ppp", age:"19" } res.send(`typeof(${functionName}) == 'function' && ${functionName}(${JSON.stringify(person)})`) })
|
1.2 CORS
1 2 3 4 5 6 7 8 9
| Cross Origin Resource Share,跨域资源共享。不需要客户端做额外的处理,只要服务添加下面代码即可。 //服务端代码 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header('Access-Control-Allow-Headers', 'Content-type'); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,PATCH"); res.header('Access-Control-Max-Age',6000);//预请求缓存10分钟 next(); });
|
1.3.配置devserver的proxy
在前端的工程化项目(webpack)中,我们可以通过配置devserver的proxy来解决跨域访问的问题。他的原理是在本地开启一个服务器向数据服务器发送请求,因为服务器和服务器之间是没有跨域
1.4.反向代理(ngix)
但是因为webpack的devserver只在开发环境下有效,当项目发布上线之后仍然会有跨域问题,为了解决项目上线的跨域问题,我们配置服务器的反向代理(ngix)
1.5.打包成apk
除此之外,我还知道当项目打包成apk之后就不存在跨域问题了,所以如果项目要打包成apk,我们需要在项目中的所有请求中写全路径(此时我们可以配置axios.default.baseURL来解决)
感谢鼓励