node.js backbone.js jquery 跨域访问 利用CORS
2013-12-24 13:46
435 查看
刚刚接触backbone.js 和 node.js 做跨域处理的时候困扰了我好几天,通过差各种资料终于解决了,但是基本上都是英文的,而且没有完整的一个资料介绍node和backbone的设置,所以发表篇中文的,共咱国人参考!
因为刚接触不久,以前是写C++服务器的,从来没接触过webserver,所以可能有很多地方说的不深刻,望见谅!如有错误处还请指出,共同探讨!
首先服务端要允许跨域
node.js express 服务端设置:
利用express的中间件
注意一定要在app.use(app.router);之前!
简单解释一下
cors跨域请求首先会发送一个OPTIONS给服务端,直接返回200就可以
backbone.js 客户端设置:
backbone.js的通信是基于jquery的,所以先看看jquery应该怎么样设置:
设置了这俩项通信就应该没有问题了!
那么看看backbone.js应该怎么设置:
当backbone.js有通信的时候会事先调用Backbone.sync函数,我们重载这个函数把crossDomain、withCredentials设置上就ok了!
在通常写backbone.js客户端的时候通常会直接利用jquery的ajax进行通信,比如post登陆信息等,下面举个简单登陆的例子:
主要还是设置下crossDomain和withCredentials属性。这样基本上就ok了!
另外,客户端和服务端的domain最好是在一个domain下,这样cookie才能保证没问题。
node.js服务端设置方法:
一、首先在中间件上设置
二、在生成cookie时设置
可能设置其中一个就可以,但是我测试的时候总出现问题,不知道是不是别的地方影响的,所幸就都设置上了!
ok done!
因为刚接触不久,以前是写C++服务器的,从来没接触过webserver,所以可能有很多地方说的不深刻,望见谅!如有错误处还请指出,共同探讨!
首先服务端要允许跨域
node.js express 服务端设置:
利用express的中间件
var allowCrossDomain = function(req, res, next) { // if the origin was not passed. var origin = (req.headers.origin || "*"); console.log('origin:' + origin); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Origin', origin); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); res.header('Access-Control-Allow-Headers', 'Set-Cookie, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version'); if ("OPTIONS" == req.method) { res.send(200); } else { next(); } }; app.use(allowCrossDomain);
注意一定要在app.use(app.router);之前!
简单解释一下
res.header('Access-Control-Allow-Credentials', true); //允许客户端发送cookie信息 res.header('Access-Control-Allow-Origin', origin); //origin为客户端自己的域名,如果不是跨域为'*' res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); //允许客户端发送的请求方法
cors跨域请求首先会发送一个OPTIONS给服务端,直接返回200就可以
backbone.js 客户端设置:
backbone.js的通信是基于jquery的,所以先看看jquery应该怎么样设置:
$.ajaxPrefilter(function(options, originalOptions, jqXHR) { options.crossDomain ={ crossDomain: true }; options.xhrFields = { withCredentials: true }; }); crossDomain: true // 允许跨域 withCredentials: true //允许发送cookie数据给服务器,默认为false
设置了这俩项通信就应该没有问题了!
那么看看backbone.js应该怎么设置:
(function() { var proxiedSync = Backbone.sync; Backbone.sync = function(method, model, options) { options || (options = {}); if (!options.crossDomain) { options.crossDomain = true; } if (!options.xhrFields) { options.xhrFields = {withCredentials:true}; } return proxiedSync(method, model, options); }; })();
当backbone.js有通信的时候会事先调用Backbone.sync函数,我们重载这个函数把crossDomain、withCredentials设置上就ok了!
在通常写backbone.js客户端的时候通常会直接利用jquery的ajax进行通信,比如post登陆信息等,下面举个简单登陆的例子:
$.ajax({ type: 'post', crossDomain: true, url: 'http://your.url.com/admin/login', data: { UserName: $('#name:text', this.el).val(), PassWord: $('#Password:password', this.el).val() }, dataType:'json', xhrFields: { withCredentials: true }, success: function(data, textStatus, jqXHR){ console.log("getAllResponseHeaders:"+jqXHR.getAllResponseHeaders()); console.dir(jqXHR); Backbone.history.navigate("#booklist",true); } });
主要还是设置下crossDomain和withCredentials属性。这样基本上就ok了!
另外,客户端和服务端的domain最好是在一个domain下,这样cookie才能保证没问题。
node.js服务端设置方法:
一、首先在中间件上设置
app.use(express.session({ secret: config.session_secret, cookie: { domain: '.YourDomain.com'} }));
二、在生成cookie时设置
res.cookie(config.auth_cookie_name, auth_token, {domain: '.YourDomain.com'});
可能设置其中一个就可以,但是我测试的时候总出现问题,不知道是不是别的地方影响的,所幸就都设置上了!
ok done!
相关文章推荐
- 利用cors,实现js跨域访问Tomcat下资源
- 利用CORS配置实现jQuery对WebApi及MVC的跨域访问
- 利用cors,实现js跨域访问Tomcat下资源
- 跨域访问解决方案:利用CORS
- 利用JS跨域做一个简单的页面访问统计系统
- nodejs express 允许跨域访问(Access-Control-Allow-Origin)
- cors跨域 可以让js直接访问接口而不需要jsop等跨域操作
- NodeJS+ExpressJS解决跨域请求CORS
- NodeJS+ExpressJS解决跨域请求CORS
- 利用Node.JS访问Azure用户角色信息
- 利用JS跨域做一个简单的页面访问统计系统
- nodejs express 允许跨域访问(Access-Control-Allow-Origin)
- jquery下利用jsonp跨域访问实现方法
- 利用Node.JS访问Azure用户角色信息
- 解决ajax不能访问本地文件(利用js跨域原理)
- Node.js实现CORS跨域资源共享
- 利用jquery跨域访问一般处理程序
- 在jQuery与Node之间创建跨域请求(Cross-Origin Resource Sharing (CORS) )
- jquery:利用jsonp跨域访问--转载