热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端跨域访问后端数据的方法

参考链接:https:mp.weixin.qq.coms4G_27oRLSMMYBFvtYZgqcg一、什么是跨域当两个域名的协议、子域名、主域名、端口号中有任意一个不

参考链接:https://mp.weixin.qq.com/s/4G_27oRLSMMYBFvtYZgqcg

一、什么是跨域

当两个域名的协议、子域名、主域名、端口号中有任意一个不相同的时候,两者之间的请求便存在跨域。

1、什么是同源策略及其限制内容

  同源策略是一种约定,它是浏览器最核心也是最基本的安全功能。如果缺少了同源策略,浏览器很容易遭受XSS、CSRF等攻击。所谓同源是指\'协议+域名(子域名、主域名)+端口号\'三者相同,即便两个不同域名指向同一个IP,也不属于同源。

2、常见的跨域场景

 

 

 特别说明:

  HTML标签中img、link、script的这三个标签允许跨域加载资源

注:

1.请求跨域了,那么请求有没有发出去?

  跨域并不是请求发不出,请求能正常发送并且服务器也能正常接收和返回结果,只不过结果被浏览器拦截了。

2.为什么表单方式可以发起跨域请求而Ajax不能?

  归根结底,跨域是为了阻止用户读取到另一个域名下的内容。Ajax可以获取响应,浏览器认为不安全拦截了响应。但是表单并不会获取新的内容,所以可以发起跨域请求。同时也说明了跨域并不能完全阻止CSRF,因为请求已经发出去了。

二、跨域解决方案

1、JSONP

  原理:利用script标签没有跨域限制的漏洞,网页可以得到其他动态来源的JSON数据。此方式需要目标服务器支持才能实现。

  1.1 Ajax与JSONP对比

  原则上两者都是客户端向服务端发送请求并获取服务端返回的数据。但是Ajax属于同源策略,JSONP属于非同源策略。

  1.2 JSONP的优缺点

  优点:JSONP的兼容性好,能解决大部分主流浏览器的跨域数据访问的问题。

  缺点:JSONP仅仅支持get请求,对数据安全性无法保障

  1.3 Jquery中ajax通过jsonp获取跨域数据示例
  请求方JS代码:

$(function () {
    $.ajax({
        url:\'http://test.cache.com/index/checkjsonp.html\',
        dataType:\'jsonp\',
        type:\'get\',
        jsonpCallback:\'checkCallback\', //自定义传递给服务器的函数名,而不是使用jQuery自动生成的,可省略
        jsonp:"callback",
        success:function (data) {
            console.log(data)
        },
        error:function () {
            alert(\'error\')
        }
    })
});

 跨域服务器返回PHP代码:

    public function checkJsonp()
    {
        echo "checkCallback(".json_encode(array(\'success\'=>1)).")";
    } 

   返回结果:

2、HTTP访问控制(CORS)

 2.1 原理:  

          CORS需要浏览器和服务器同时支持,IE8和9需要通过XDomainRequest来实现,存在一定的兼容性问题。

     浏览器会自动的进行CORS通信,实现CORS通信的关键在于服务器。只要服务器实现了CORS,也就实现了跨域 

 2.2 实现:

    服务端设置 Access-Control-Allow-Origin 就可以开启CORS。该属性表示那些域名可以访问该网站,如果设置成通配符则表示所有网站均可访问

 2.3 示例:

  JS代码:

$(function () {
    $.ajax({
        url:\'http://test.cache.com/index/checkjsonp.html\',
        dataType:\'json\',
        type:\'get\',
        success:function (data) {
            console.log(data)
        },
        error:function () {
            alert(\'error\')
        }
    })
});

 PHP代码:

    public function checkJsonp()
    {
        header("Access-Control-Allow-Origin:http://initial.think6.com");
        header(\'Access-Control-Allow-Methods:OPTIONS, GET, POST\'); // 允许option,get,post请求
        header(\'Access-Control-Allow-Headers:x-requested-with\'); // 允许x-requested-with请求头
        echo json_encode(array(\'success\'=>1));
    }

 返回结果:

3、WebSocket

原理:WebSocket是一种通信协议,它实现了浏览器与服务器之间的全双工通信(即通信双方可以同时发动和接收信息的信息交互方式)。同时websocket并不实行同源策略,只要服务器支持,它就可以实现跨域通信。

4、Node中间件代理

原理:同源策略是浏览器需要遵循的标准,服务器向服务器请求则无需遵循同源策略,从而实现跨区数据请求。

 

5、nginx反向代理

实现原理类似于Node中间件,需要搭建一个中转nginx服务器,用于转发请求。使用nginx反向代理实现跨域是最简单的方式,只需要修改nginx服务器配置即可解决跨域问题,支持所有浏览器、session。无需修改代码且不会影响服务器性能。

 

 

 

 

 

 

   

 


推荐阅读
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • jQuery如何判断一个元素是否被点击?
    本文介绍了使用jQuery判断一个元素是否被点击的方法,并通过示例进行了具体说明。注意要指定父级,否则会执行多次。 ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
  • 本文介绍了使用jQuery实现图片预加载和等比例缩放的方法,同时提供了演示和相关代码。该方法可以重置图片的宽度和高度,并使图片在水平和垂直方向上居中显示。 ... [详细]
  • 获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法
    本文介绍了获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法,包括使用jQuery的选择器和遍历方法。通过这些方法,可以方便地获取到所需的元素,并进行相应的操作。 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 由于同源策略的限制,满足同源的脚本才可以获取资源。虽然这样有助于保障网络安全,但另一方面也限制了资源的使用。那么如何实现跨域呢,以下是实现跨域的一些方法。 ... [详细]
author-avatar
潇潇雨621715
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有