标题: CORS||跨域资源共享||NodeJs版本实现
出处:刘新修
时间:Tue, 13 Sep 2016 21:57:45 +0000
作者:刘新修
地址:http://liuxinxiu.com:80/CORS_Node/
内容:
使用NodeJs实现CORS 跨域资源共享,可传参origin通过限制,代码如下:
JavaScript代码
var http=require('http'); var origin=require('./origin'); //调用白名单列表 function CORS_Node(){ this.exec=function(route,req,res){ var _self=this; /************** 获取客户端origin的域名 **************/ origin.req=req; //白名单设置置请求头 origin.yes=origin.listV(); //是否在名单|true origin.name=origin.getName(); //客户端ORIGIN /******** 先纠正参数,参数正确后匹配白名单 ********/ /********** 判断是GET请求类型 **********/ if(req.method.toUpperCase()=="GET"){ var params=[]; //params=url.parse(request.url,true).query; //params['fruit']=compute(params); res.writeHeader(200,{ "Content-type":"text/html; charset=utf-8" }); res.write('
It is forbidden for the URL request!
'); res.write('
NodeJs/'+process.version); res.write(' at '+req.headers.host.split(':')[0]); res.write(' Port '+req.headers.host.split(':')[1]+''); res.end(); } /********* 判断是POST请求类型 **********/ else if(req.method.toUpperCase()=='POST'){ var postData=""; /********** 读取Post提交的数据 **********/ req.addListener("data",function(data){ postData+=data; }); /********** 数据读取完毕就会执行的监听 *********/ req.addListener("end",function(){ /********* 定义Post请求主体 *********/ var query=require('querystring').parse(postData); /********** 给客户端返回数据自造JSON **********/ function getJson(status){ if(isNaN(status))status=-1; else{status=Number(status)} var _drr='{' +'"status":"1",' +'"name":"'+query.name+'",' +'"gender":"'+query.gender+'"}'; var _arr='{' +'"status":1,' +'"url":"http://www.liuxinxiu.com/",' +'"dataList":' +'{' +'"siteId":101,' +'"title":"我的博客||Node Server",' +'"images":"http://www.liuxinxiu.com/upload/2016/08/10/moren.gif",' +'"indexNum":"10",' +'"pageNum":"100000",' +'"tagNum":"22",' +'"linkType":"linkTaobao",' +'"publishTime":"23:15:30"' +'}' +'}'; this._dr=JSON.parse(_drr);this._ar=JSON.parse(_arr); this._dt=this._dr;this._dt.getUser=this._ar; } var errStr={"status":-1,"info":"Request Error"}; /********** 先初步设置头信息,跨域全放开稍后再进行匹配验证 **********/ var content_type,content_length, content_type='application/json; charset=utf-8'; content_length=Buffer.byteLength(res,'utf8'); res.setHeader('Access-Control-Allow-Origin','*'); res.setHeader('Access-Control-Allow-Headers','X-Requested-With'); res.setHeader('Access-Control-Allow-Methods','GET,POST,PUT,DELETE,OPTIONS'); res.setHeader('Content-Type',content_type); res.setHeader('Server','NodeJs/'+process.version); /************** 判断如果有POST过来规范的数据 *************/ if(query.name&&query.gender){ //调用数据 getJson(1); /******** 匹配客户端域名是否在数组列表中 ******/ //if(_self.in_array(origin,allow_origin)){ if(origin.yes){ res.setHeader('Access-Control-Allow-Origin',origin.name); res.end(JSON.stringify(_dt)); } else{ /******** 如有设置就取设置URL返回头信息 ********/ if(query.origin){ res.setHeader('Access-Control-Allow-Origin',query.origin); res.end(JSON.stringify(_dt)); } /******** 没设置URL就返回无权限错误信息 ********/ else{ errStr.info="You don't have permission to submit!"; res.setHeader('Access-Control-Allow-Origin',origin.name); res.end(JSON.stringify(errStr)); } } } /********* 没有所匹配的POST提交数据||都要设头返回信息 ********/ else{ /******** 其他POST参数的提交 ********/ if(query){ res.writeHeader(res.statusCode,{ "Access-Control-Allow-Origin":origin.name, "Access-Control-Allow-Headers":"X-Requested-With", "Access-Control-Allow-Methods":"GET,POST,PUT,DELETE,OPTIONS", "Content-type":"application/json; charset=utf-8" }); var err={status:-1,info:"Syntax error in parameters or arguments."}; res.end(JSON.stringify(err)); } else{ res.writeHeader(res.statusCode,{ "Content-type": "text/html; charset=utf-8" }); res.end('It is forbidden for the URL request!'); } } /****** 判断结束 ******/ }); } /****** 内部结束 ******/ } } module.exports=new CORS_Node();
NodeJs数据提交接口地址 (不允许使用GET访问) :http://liuxinxiu.com:3000/CORS_Node/
注意:NodeJs Server 是本站的测试环境,有时候因需要会临时关闭,该地址仅供测试,如您有需要请自建环境~
配合HTML代码如下:
XML/HTML代码
跨域测试
HTML访问地址 (测试跨域) ==> http://test1.liuxinxiu.com/php/Interface/html/server.html?n=node
HTML访问地址 (非法参数) ==> http://test1.liuxinxiu.com/php/Interface/html/server.html?error=node
注意:本站的 NodeJs Server 是学习测试环境,有临时关闭的可能,建议在本地环境测试~
Generated by Bo-blog 2.1.1 Release