`
hongtoushizi
  • 浏览: 376632 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Nodejs(七)-跨域访问

阅读更多

转载自: http://xfhnever.com/blog/2014/08/14/nodejs-crossdomainaccess/

 

今天在使用ajax(http://localhost:8080%EF%BC%89%E8%B0%83%E7%94%A8nodejs%E5%86%99%E7%9A%84restfulAPI(http://localhost:3000%EF%BC%89%E6%97%B6%EF%BC%8C%E6%8A%A5%E4%BA%86%E5%A6%82%E4%B8%8B%E4%B8%80%E4%B8%AA%E9%94%99%E8%AF%AF%EF%BC%9A

XMLHttpRequest cannot load http://localhost:3000/mock/items. 
No 'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://localhost:8080' is therefore not allowed access.

晚上说不能跨域访问,完全不懂这个概念啊,所以简单介绍一下。

解决方案

首先给大家介绍一下这个问题的解决方案,我是在node代码中设置跨域访问。

var app = express();  
//设置跨域<strong>访问</strong>  
app.all('*', function(req, res, next) {  
    res.header("Access-Control-Allow-Origin", "*");  
    res.header("Access-Control-Allow-Headers", "X-Requested-With");  
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  
    res.header("X-Powered-By",' 3.2.1')  
    res.header("Content-Type", "application/json;charset=utf-8");  
    next();  
}); 

把Access-Control-Allow-Origin设置为‘*’,表示任意origin可以访问该API. 在实际应用中这样是不安全的,需要制定具体的origin。

当然也可以只对某些url设置跨域访问:

router.get('/', function(req, res) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.send('respond with a resource');
});

何为跨域

域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。

跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站点上的资源。这种情况很常见,比如说通过style标签加载外部样式表文件、通过 img 标签加载外部图片、通过 script 标签加载外部脚本文件、通过 Web font 加载字体文件等等。默认情况下,脚本访问文档属性等数据采用的是同源策略(Same origin policy)。

同源策略:如果两个页面的协议、域名和端口是完全相同的(IE的同源策略不包含端口),那么它们就是同源的。同源策略是为了防止从一个地址加载的文档或脚本访问或者设置从另外一个地址加载的文档的属性。如果两个页面的主域名相同,则还可以通过设置document.domain 属性将它们认为是同源的。

出于安全性考虑,浏览器将不允许跨域页面间的JS相互操作,如:主页面和跨域IFrame之间的JS操作,也不允许XMLHttprequest请求跨域内容。

在浏览器中不能直接来跨域访问,而在服务器端没有跨域安全限制。

其他解决方法

  1. 主域名相同的跨域情形

    设置document.domain属性。如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和iframe里面都加上document.domain = “aa.com”,这样就可以统一域了,可以实现跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了。

  2. HASH传值

    当两个域不同时,如果想相互调用,那么同样需要两个域都是由你来开发才可以。用iframe可以实现数据的互相调用。解决方案就是用window.location对象的hash属性。hash属性就是http://domian/web/a.htm#dshakjdhsjka 里面的#dshakjdhsjka。利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信。不过除了IE之外其他大部分浏览器只要改变hash就会记录历史,你在前进和后退时就需要处理,非常麻烦。不过再做简单的处理时还是可以用的。大体的过程是页面a和页面b在不同域下,b通过iframe添加到a里,a通过JS修改iframe的hash值,b里面做一个监听(因为JS只能修改hash,数据是否改变只能由b自己来判断),检测到b的hash值被修改了,得到修改的值,经过处理返回a需要的值,再来修改a的hash值(这个地方要注意,如果a 本身是那种查询页面的话比如http://domian/web/a.aspx?id=3,%E5%9C%A8b%E4%B8%AD%E7%9B%B4%E6%8E%A5parent.window.location%E6%98%AF%E6%97%A0%E6%B3%95%E5%8F%96%E5%BE%97%E6%95%B0%E6%8D%AE%E7%9A%84%EF%BC%8C%E5%90%8C%E6%A0%B7%E6%8A%A5%E6%B2%A1%E6%9C%89%E6%9D%83%E9%99%90%E7%9A%84%E9%94%99%E8%AF%AF%EF%BC%8C%E9%9C%80%E8%A6%81a%E6%8A%8A%E8%BF%99%E4%B8%AA%E4%BC%A0%E8%BF%87%E6%9D%A5%EF%BC%8C%E6%89%80%E4%BB%A5%E4%B9%9F%E6%AF%94%E8%BE%83%E9%BA%BB%E7%83%A6%EF%BC%89%EF%BC%8C%E5%90%8C%E6%A0%B7a%E9%87%8C%E9%9D%A2%E4%B9%9F%E8%A6%81%E5%81%9A%E7%9B%91%E5%90%AC%EF%BC%8C%E5%A6%82%E6%9E%9Chash%E5%8F%98%E5%8C%96%E7%9A%84%E8%AF%9D%E5%B0%B1%E5%8F%96%E5%BE%97%E8%BF%94%E5%9B%9E%E7%9A%84%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%86%8D%E5%81%9A%E7%9B%B8%E5%BA%94%E7%9A%84%E5%A4%84%E7%90%86%E3%80%82

  3. JS脚本植入

    通过页面动态加载<script>标签实现,该标签的SRC属性设置为跨域请求的URL地址,返回的内容为method(…)形式,其中method为页面内的JS回调函数,通过执行该函数来实现改变。

  4. JQuery实现

     function jsonpajax_1() {
    
         $.ajax({
    
             url: "http://192.168.1.105:8123/Handler.ashx?callback=?",
    
             type: "get",
    
             dataType: "jsonp",
    
             jsonp: "callback",
    
             success: function(data) {
    
                 var tt = '';
    
                 $.each(data, function(k, v) {
    
                     tt += k + ":" + v + "<br/>";
    
                 });
    
                 $("#divmessage").html(tt);
    
             }
    
         });
    
     }
    

此时,跨域的Web1中的ashx文件数据提供要改一下:

    string callback = context.Request.Params["callback"];
    context.Response.Write(callback+"("+strJson+")");

jsonp的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了.

如果设为dataType: ‘jsonp’, 这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议.

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问

JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,

我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。

这种跨域的通讯方式称为JSONP。

分享到:
评论

相关推荐

    Node.js配合node-http-proxy解决本地开发ajax跨域问题

    情景: 前后端分离,本地前端开发...3. 用nodejs搭建本地http服务器,并且判断访问接口URL时进行转发,完美解决本地开发时候的跨域问题。  用到的技术: 1. nodejs搭建本地http服务器 2. 应用node-http-proxy,做

    nodeJs 跨域请求

    // 允许所有来源访问 res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // 允许的HTTP方法 res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); // 允许的...

    cocos http跨域访问nodejs

    在这个场景中,我们讨论的是如何利用Cocos2d-x进行HTTP跨域访问Node.js服务器。在Web开发中,跨域(Cross-Origin)是一个常见但有时棘手的问题,特别是在涉及到不同源之间的数据交换时。本文将深入探讨Cocos2d-x与...

    一个仿知乎论坛博客系统 nodejs-express

    【标题】"一个仿知乎论坛博客系统 nodejs-express" 是一个基于 Node.js 和 Express 框架构建的在线问答及博客平台,旨在模仿知乎的功能和用户体验。Node.js 是一个高性能、轻量级的JavaScript运行环境,常用于构建...

    nodejs-mongodb-restapi:使用Node js和MongoDB的REST Api

    5. JSON Web Token (JWT):用于身份验证的一种安全机制,可以生成和验证JSON格式的令牌,确保只有授权的用户才能访问特定的API端点。 6. 错误处理:在任何应用程序中,错误处理都是必不可少的。在Node.js中,我们...

    nodejs搭建本地服务器轻松解决跨域问题

    在本文中,我们将深入探讨如何使用Node.js搭建本地服务器来轻松解决跨域问题。跨域问题通常发生在浏览器的安全策略之下,限制了JavaScript从一个源(协议+域名+端口)发送Ajax请求到另一个源。然而,开发过程中经常...

    nodejs上传图片简单例子.zip

    当你运行这个批处理文件,它会启动一个本地服务器,你可以通过访问`http://localhost:8888`来查看和测试图片上传的功能。 在标签"nodejs 上传图片"中,我们可以推测这个示例将使用Node.js的HTTP服务器模块,以及...

    nodejs-lightblog:node.js制作的一个轻博客

    Node.js和Express支持中间件机制,这种机制允许开发者分层处理请求,如验证用户身份、记录日志、处理跨域请求等。在轻博客项目中,可能有自定义的中间件用于处理用户登录状态、权限控制等。 ### 6. 文件上传与静态...

    nodejs-chats-using-longpolling-eventsourcing-websockets-ulbitv:使用3种不同方式聊天的Node.js应用

    在本文中,我们将深入探讨如何使用Node.js构建实时聊天应用程序,重点关注三种不同的通信技术:长轮询、...在实践中,你也可能需要考虑性能优化、错误处理和跨域资源共享(CORS)等问题,以确保应用的稳定性和用户体验。

    Node.js设置CORS跨域请求中多域名白名单的方法

    在开发跨域资源共享(CORS)功能时,程序员经常会面临设置允许跨域请求的域名列表这一需求。在Node.js中设置CORS跨域请求的多域名白名单,可以按照以下知识点进行详细解读: 1. CORS基本概念:CORS是一种允许当前域...

    flyskywhy#g#前端CDN网址跨域访问后端nodejs应用负载均衡网址的方法1

    // 带有 www. 前缀的是可能被 CDN 加速的前端静态网页的托管服务器地址,// 没有 www. 前缀的是不在 CDN 后面因而不会被 CDN 延时 6

    nodejs-starter:Node js Starter应用程序具有快速,猫鼬,基于JWT令牌的身份验证,使用3层体系结构,PubSub模式和事件发射器进行后台作业

    服务器通过验证令牌的签名来确认用户身份,避免了传统Session存储带来的问题,如跨域、状态管理等。 此外,Pub/Sub模式是事件驱动编程的一种实现,常用于组件间的通信。在这个Node.js应用中,不同模块可以通过发布...

    nodejs-examples

    通过克隆 'dantreasure/nodejs-examples.git' 并在本地运行 'cd nodejs-examples',你可以访问一系列实践性的代码示例,覆盖了 Node.js 开发的各个方面。" 【标签】"JavaScript" 暗示了这些示例主要基于 JavaScript...

    NODE.JS跨域问题的完美解决方案

    以下就是在Express中设置跨域访问的方法: 首先,我们需要引入Express模块: ```javascript var express = require('express'); var app = express(); ``` 然后,我们需要创建一个中间件函数,专门处理跨域请求。这...

    nodejs-restify:使用Node.js和Restify制作的RESTful API

    然而,实际项目中可能还需要考虑更多的细节,比如路由分页、数据验证、缓存控制、跨域资源共享(CORS)等。 Restify提供了丰富的插件和中间件来应对这些需求,使得开发者能够根据项目规模和需求灵活定制。 总结来说,...

    VUE + nodejs实战

    - **跨域问题**:通过Node.js设置CORS策略,解决前后端跨域访问限制。 - **部署**:Node.js应用可以通过PM2等进程管理工具部署到服务器,Vue应用通常构建为静态资源部署到Nginx或Apache等服务器。 4. **CSS与Vue....

    nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)

    在本文中,我们将探讨如何使用Node.js(Express 4.x)和Vue(通过vue-cli)构建一个前后端分离的应用,并解决跨域问题。首先,确保你已经安装了Node.js环境,这是运行Express和Vue的基础。 **一、Express 4.x 后端...

    node跨域转发 express+http-proxy-middleware的使用

    Node 跨域转发是指在 Web 开发中,前端和后端分离,实现跨域资源共享的技术。Express 是一款基于 Node.js 的 Web 应用框架,http-proxy-middleware 是一个 Node.js 代理中间件,用于将客户端请求代理到目标服务器上...

    rest-api-nodejs

    - **cors**:跨域资源共享(CORS)中间件,允许来自不同源的请求。 - **mongoose**:与 MongoDB 数据库交互的 ORM 工具。 - **jsonwebtoken**:生成和验证 JSON Web Tokens(JWT)进行身份验证。 - **express-...

Global site tag (gtag.js) - Google Analytics