`
dftwilson
  • 浏览: 22429 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

web前端跨域问题解决方法集锦

阅读更多
1 何为跨域(CORS)?
所謂跨站HTTP請求(Cross-site HTTP request)是指發出請求所在網域不同於請求所指向之網域的HTTP請求,例如網域A (http://domaina.example) 的網頁載入一個<img>元素向網域B(http://domainb.foo) 請求影像資源(http://domainb.foo/image.jpg) 。這種作法在現今各網頁相當常見,網頁常常會載入其他網站資源,像是CSS樣式表、影像、程式碼等等資源。
即基于安全性考虑,在javascript中制定了同源策略(Same Origin Policy)。简单来讲,只有拥有相同的协议(同为http或https) + 端口(port)+ 主机(domain) 才属于同一个源(origin),只有此类才可以进行资源的交互。
________________________________________
2 外网跨域
针对外网的跨域,即在本地(localhost) / 你的站点 中,想获取外部的数据,一般为其他的开放API。如google map api,但此时的数据与 你的站点不属于同源,当进行请求时,浏览器则会提示across origin error。
随着html5的诞生,W3C也开始考虑对跨域的请求方式进行规范。
解决方法:
1. XMLHttpRequest Level 2(简称XHR) —— 新版本的http(s)通信方式
由于老版本XHR收到同源策略限制,只能向同一域名的服务器请求数据。
因此新版本,针对老版本的缺点,做了改进,支持 跨域请求。
但前提是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"(Access-Control-Allow-Origin设置)。如果能够满足上面的条件,则代码的写法与不跨域的请求完全一样。
2.      var xhr = new XMLHttpRequest();
3.      xhr.open('GET', 'http://maps.googleapis.com/maps/api/distancematrix/json');
4.      xhr.onload = function(e) {
5.        var data = JSON.parse(this.response);
6.        ...
7.      }
     xhr.send();
新版XHR中,新增了xhr.responseType,xhr.response属性,可以告诉浏览器,请求后返回什么格式的数据,使我们可以更方便的抓取二进制blob形式的文件。详情可参考XMLHttpRequest2 新技巧。
8. JSONP —— 新型的简单的解决方法
JSONP可以克服 XMLHttpRequest 的同源限制,简单的获取到不同源的数据。
原理很简单,就是script标签 + callback 。(因为 script 并不受同源限制的影响)
     script = document.createElement("script");
     script.type = "text/javascript";
     script.src = "http://www.someWebApiServer.com/some-data";
执行过后,将会得到下面的数据:
     <script>{['some string 1', 'some data', 'whatever data']}</script>
但是这种形式,有些不方便抓取到里面的数组,因此改进如下:
     script = document.createElement("script");
     script.type = "text/javascript";
     script.src = "http://www.someWebApiServer.com/some-data?callback=my_callback";
注意到了吗,我们添加了一个 my_callback 函数。因此,当服务器接受到你的请求时,会找到该callback参数,并相应生成下面的形式:
     my_callback({['some string 1', 'some data', 'whatever data']});
这样的有利之处在于,我们所获取的数据会自动回调到 my_callback中。
原生javascript用法:
<html>     <head>     </head>     <body>         <div id = 'twitterFeed'></div>         <script>         function myCallback(dataWeGotViaJsonp){
             var text = '';
             var len = dataWeGotViaJsonp.length;
             for(var i=0;i<len;i++){
                 twitterEntry = dataWeGotViaJsonp[i];
                 text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'             }
             document.getElementById('twitterFeed').innerHTML = text;
         }
         </script>         <script type="text/javascript" src="http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=myCallback"></script>     </body></html>
jquery用法:
<html>     <head>         <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>         <script>             $(document).ready(function(){
                 $.ajax({
                     url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
                     dataType: 'jsonp',
                     success: function(dataWeGotViaJsonp){
                         var text = '';
                         var len = dataWeGotViaJsonp.length;
                         for(var i=0;i<len;i++){
                             twitterEntry = dataWeGotViaJsonp[i];
                             text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'                         }
                         $('#twitterFeed').html(text);
                     }
                 });
             })
         </script>     </head>     <body>         <div id = 'twitterFeed'></div>     </body></html>
1. 利用Chrome 插件解决跨域 —— 无需借助服务器声明,无障碍跨域
如果我不想这么麻烦,我只想批量抓取外网的一些数据结果,是否有简单的方法呢?
当然,目前Chrome扩展中为了方便插件获取不同域的数据,提供了解决方法。
即只需在manifest.json文件中的"permission"中声明,再用xmlhttpRequest即可。详情可参考Chrome扩展开发手册
    {
      "name": "My extension",
      ...
      "permissions": [
        http://www.google.com/       ],
      ...
    }
________________________________________
3 本地跨域
有时,我们在本地运行页面时,也会遇到across origin error的情况。
这个是因为浏览器的限制。 目前chrome、firfox、opera都出现了这种情况,因为有安全沙箱,它们认为加载本地其它文件为跨域访问(但是使用IE8就不会出现这种错误)。
为了解决该问题,解决方法有两种:
1. 设置Chrome启动参数
在启动Chrome时,添加一个参数:--allow-file-access-from-files
每次启动Chrome都使用该快捷方式,即可解决本地跨域问题
2. 启动Apache设置虚拟主机
Apache中含有虚拟主机的功能,即可以将不同路径下的资源(file://d:/projectA ; file://c:/projectB),设置成同源(localhost/projectA; localhost/projectB),这样引用时,由于都处在 localhost下,因此不会出现跨域问题。
    #设置虚拟主机与虚拟目录
      #配置文件 Apache安装目录 \conf\extra\httpd-vhosts.conf    <VirtualHost *:80>        UseCanonicalName Off        ServerName localhost
        DocumentRoot "D:/projectA" 
        <Directory "D:/projectB">            Options Indexes FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all        </Directory>    </VirtualHost>    Alias /projectA "D:/projectA"    Alias /projectB "C:/projectB"
详细配置可参考Apache VirtualHost配置
参考
[1] XMLHttpRequest2 新技巧
[2] Chrome扩展开发手册
[3] 解决Chrome跨域的方法
[4] JavaScript的同源策略
[5] XMLHttpRequest Level 2 使用指南
分享到:
评论

相关推荐

    docker部署nginx,挂载多个前端部署目录以及跨域问题解决方案.txt

    为了节约成本,很多时候一台server 的nginx可能要部署多个前端的情况,本实例是在docker环境下部署两个前端,同时处理前端调用后端跨域问题,本示例为阿里云centos7 系统docker20.10.6环境下nginx1.19.5版本 ...

    前端跨域解决方案

    前端跨域解决方案,jsonp和cros两种解决方式。我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如[removed]、、&lt;iframe&gt;。那就是说如果要跨域访问数据,...

    web前端跨域取JSON

    基于HTML5+CSS3的一个小程序,适合新手学习,主要用了跨域取json的方法

    WEB前端关于跨域问题的8种解决方案

    最近处理几个项目,设计服务器,所以研究了下跨域问题,综合总结了下,同行们多给点意见,其中涉及前端解决(最基本),JavaScript解决,socket解决,JSONP解决等,个人推荐使用socket和JSONP,使用方便,还稳定。

    前端解决跨域问题的8种方案.docx

    文档提供了多种方式解决前端调用WebApi时,跨域问题。让你轻松解决所有跨域烦恼。

    web前端九种跨域方法教学视频

    关于web前端九种跨域方法的视频和webpack4.0,mvvm原理以及react路由

    Web应用跨域通信解决方案课件。

    讲到跨域通信,我们首先要了解什么是跨域?跨域大致的意思就是,比如:www.XXX.com域名下的js是不能操作www.YYY.com域名下的对象或者元素

    web前后端分离开发——前端Vue跨域配置

    web前后端分离开发,前端Vue跨域配置和服务器端nginx跨域配置

    WEB前端黑客技术揭秘.pdf

    主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、字符集、跨域、原生态攻击、高级钓鱼、蠕虫思想等,这些都...

    解决前端开发过程中遇到的 跨域问题。

    linux: 跨域-linux -p 8888 -h url windows: 跨域.exe -p 8888 -h url 具体使用时: 比如说 你需要调用的接口是 POST http://88.88.88.88:653/auth/info 现在你需要调用的接口地址换成 POST ...

    有关Ajax跨域问题的两种解决方法

    Ajax跨域是前端开发中常见的问题,本文描述了以Google浏览器Chrome作为客户端和以Tomcat作为Web服务器的情况下的解决办法。 问题现象 当出现跨域访问的时候ajax通常会报类似如下错误: XMLHttpRequest cannot load ...

    Node.js-LiveNode.js超简单的前端跨域前后端分离解决方案

    LiveNode是一个基于Node.js轻巧的web服务,帮助前端开发者解决本地跨域,代码刷新,以及SPA(单页应用)前后端服务分离,并且可以用于生产环境项目部署

    如何用Nginx解决前端跨域问题

    最简单的解决方法,就是把浏览器设为忽略安全问题,设置–disable-web-security。不过这种方式开发PC页面到还好,如果是移动端页面就不行了。 解决办法 使用Nginx转发请求。把跨域的接口写成调本域的接口,然后将...

    Web前端黑客技术解密

    主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、字符集、跨域、原生态攻击、高级钓鱼、蠕虫思想等,这些都...

    Web前端黑客技术揭秘

    web前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含web 前端安全的跨站脚本(xss)、跨站请求伪造(csrf)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、cookie安全、flash 安全、dom 渲染...

    利用Nginx代理如何解决前端跨域问题详析

    前言 ... 本文将讲述如何使用 Nginx 在 Web 前后端分离开发中实现路由的转发。 Web 开发通常使用的是前后端分离的开发模式,即前端和...这在开发过程中会导致 跨域 问题,即在一个域名下的网页,是无法通过 Ajax 请求另

    web前端黑客技术揭秘

    主要包含Web前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash安全、DOM渲染、字符集、跨域、原生态攻击、高级钓鱼、蠕虫思想等,这些都...

    Nginx 解决WebApi跨域二次请求以及Vue单页面的问题

    由于项目是前后端分离,API接口与Web前端 部署在不同站点当中,因此在前文当中WebApi Ajax 跨域请求解决方法(CORS实现)使用跨域处理方式处理而不用Jsonp的方式。 但是在一段时间后,发现一个很奇怪的问题,每次...

    Web前端设计与开发【htm、javascript、css、jQuery、vue框架学习】初学者学习前端的必备课程设计安排

    Web前端设计与开发和前端框架搭建与进阶开发 【htm、javascript、css、jQuery学习】初学者学习前端的必备课程设计安排 内容包括: 1.html学习路径课程和整理的学习地址链接 2.css学习路径课程和整理的学习地址链接 3...

    跨域访问---------

    现在的web工程越来也大,传统的开发模式已经显得捉襟见肘了,不仅开发人员在开发过程中很痛苦,后期维护的人员也更痛苦。...下面我们介绍一种测地解决前端跨域访问的方式,本地服务器请求转发的方式。

Global site tag (gtag.js) - Google Analytics