CORS跨域请求
CORS是W3C推出的一种新的机制,即跨资源共享(Cross-Origin Resource Sharing)。这种机制允许浏览器向跨源服务器发出XMLHTTPRequest请求,它基于浏览器的一个内置机制需要浏览器的支持。
简单请求必须满足:1.请求方式为get,post,head 2.数据类型Content-Type只能是application/x-www-form-rulencoded、mulitipart/form-data或text/plain中的一种
简单请求
//客户端 <!DOCTYPE html> <html> <head> <title>cors</title> <meta charset="utf-8"> </head> <body> <button onclick="sendGet()">点击我发一个简单的请求</button> <script type="text/javascript"> // ajax发送请求的函数 function sendGet(){ var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState === 4 && xmlHttp.status === 200){ var data = xmlHttp.responseText; alert(data); } }; // get方式的简单请求 xmlHttp.open('GET','http://localhost:3000/3-6-2-cors-1-data',true); xmlHttp.send(); } </script> </body> </html> // 服务器端 // jsonp跨域 app.get('/3-6-2-json-1.js',function(req,res){ res.render('3-4-1-post'); }); // cors.html app.get('/cors',function(req,res){ res.render('cors'); });
预请求
预请求是一种相对复杂的请求,需要满足:1.预请求是GET,HEAD,POST以外的方式,比如PUT,DELETE等
2.使用POST请求方式,但数据是application/xml或者text/xml的XML数据请求 3.使用了自定义的请求头信息
// 服务器 // sors预请求 app.use('/3-6-2-cors-3-data',function(req,res){ res.set({ 'Access-Control-Allow-Origin':'*', 'Access-Control-Allow-Methods':'GET,PUT,POST', 'Access-Control-Allow-Headers':'X-Our-Header' }); res.send('这是来自nodejs的数据'); }); //客户端 <!DOCTYPE html> <html> <head> <title>测试cors</title> <meta charset="utf-8"> </head> <body> <button onclick="sendGet()">点击发起一个请求</button> <script type="text/javascript"> // Ajax发送请求的函数 function sendGet(){ var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState === 4 && xmlHttp.status === 200){ var data = xmlHttp.responseText; alert(data); } } // PUT方式的简单请求 xmlHttp.open('PUT','http://127.0.0.1:3000/3-6-2-cors-3-data',true); // 设置请求头信息 xmlHttp.setRequestHeader('x-Our-Header','ab'); // 发送请求 xmlHttp.send(); } </script> </body> </html>
附带凭证信息的请求
XMLHttpRequest对象在发送同域请求时会发送凭证(Http Cookie和验证信息,但是跨域请求则不会发送),所以想要传递cookie只能在请求头里携带
实例:
// 服务器 // cors_cookie app.get('/cors_cookie',function(req,res){ res.render('cors_cookie'); }); // cors_cookie app.get('/3-6-2-cors-4-data',function(req,res){ console.log(req.cookies); res.set({ 'Access-Control-Allow-Origin':'http://127.0.0.1', 'Access-Control-Allow-Credentials':true }); res.send('这是来自nodejs的数据'); }); // 客户端 <!DOCTYPE html> <html> <head> <title>cors_cookie</title> <meta charset="utf-8"> </head> <body> <button onclick="sendGet()">点击我发送一个cors跨域请求</button> <script type="text/javascript"> document.cookie = "name=ab"; // Ajax发送请求的函数 function sendGet(){ var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState === 4 && xmlHttp.status === 200){ var data = xmlHttp.responseText; alert(data); } }; // GET方式的简单请求 xmlHttp.open('GET','http://localhost:3000/3-6-2-cors-4-data',true); xmlHttp.withCredentials = true; // 只需要在客户端申明这个就好了 //xmlHttp.setRequestHeader('x-Our-Header','ab'); xmlHttp.send(); } </script> </body> </html>
ajax优缺点
ajax的优点
1.无刷新,在不刷新页面的情况下加载数据增加用户体验
2.浏览器都支持不需要重新下载额外插件
3.使用异步通信用户不用长时间来等某一个操作,可以继续其他操作
4.减轻服务器压力,加快响应速度
ajax的缺点
1.破坏后退功能,用户不能通过后退来取消前一次操作,虽有办法,但是仍然很笨重
2.网络延迟问题。通常会通过一些进度条来告诉用户正在读取数据
3.安全性问题。ajax变相地提供了一个访问数据库的接口,而且ajax的代码都是暴露在浏览器中的,很容易被黑客利用,进行脚本攻击或者sql注入,当然对应地也有一些方法去解决这些问题
总体来说优点大于缺点。