js 跨域的几种常见解决方案

深入解析JavaScript与Ajax跨域解决方案 本文还有配套的精品资源,点击获取 简介:由于浏览器同源策略限制,Web开发中常遇到JavaScript和Ajax跨域问题。本文将探讨同源策略原理,并介绍解决JavaScript和Ajax跨域的常用方法,如JSONP、CORS和代理服务器。同时,结合 和 文件,说明如何在实际项目中处理跨域请求。掌握这些跨域解决方案,对于提升用户体验和Web开发至关重要。 在现代Web开发中,同源策略是浏览器安全模型的基础之一。它保证了页面安全运行,防止恶意脚本窃取数据或对用户数据造成损害。本章 阅读详情

1. JSONP(JSON with Padding)

JSONP 技术的原理介绍

jsonp 的实现是基于html标签中src属性的数据源特性, 部分 html 标签比如 img script 可以通过 src 进行跨域访问,而浏览器不可能对这一行为进行阻止,虽然,浏览不支持js语言直接进行跨域http请求,但是我们可以间接的通过 src 属性从服务器返回一个 js 回调函数 从而实现跨域请求的目的

1. 简单的例子

浏览器端

       <script type="text/javascript">
         // 1 定义一个带参数回调函数
          function fn(data){
             alert(data);
          }
       </script>

        //2 通过 srcipt标签的 src 属性从服务器返回一个 fn(data)回调 
      <script src='http://www.test.com/jsonp/callJs.php'></script>

服务器 php 端

     <?php
       // 3 返回一个在请求页里定义好的js函数,并把参数返回 
       echo "fn('你好')";
2. 简单封装
1封装JS函数
function jsonp(params) {
//获取 head 标签
var head = document.querySelector('head');
//创建 script 标签
var script = document.createElement('script');
//创建回调函数
var call = "fn" + new Date().getTime();
window[call] = function(arg) {
console.log(arg);
params.success(arg);
// alert(3);
}
//请求 参数中 url 地址 并将 回调函数做为参数添加到 url 
script.src = params.url + '?callback=' + call;
head.appendChild(script);

}
# 2 在 html 中引用
<script src="./jsonp.js" /></script>
<script type="text/javascript">
    // 调用封装好的方法 并传递 url 和 请求成功后的回调函数
    jsonp({
        url: "http://www.longtaoge.com/jsonp/php/js.php",
        success: function(repose) {
            console.log(repose);
            //处理数据
            fillData(repose);
        }
    });

</script>
3 php返回数据
<?php
    //获取Get 请求中 jsop 的回调
    $cal=!empty($_GET['callback'])?$_GET['callback']:'';
    //从文件中读取数据并返回
    $va=file_get_contents("../data/data.json");
    //返回数据
    echo $cal.'('.$va.')';
    ?>
3. 模似封装 ajax
# 1 封装 ajax 函数
//声明一个对象
function $() {

}
//模仿ajax 函数
$.ajax = function(params) {
//获取参数 请示地址 
var url = params.url || location.pathname;
var type = params.type || 'get'; //请求方式
var data = params.data || {};  //获取请求参数
var dataType = params.dataType; //jsonp

//如果需要跨域 
if (dataType == 'jsonp') {
    var head = document.querySelector('head');
    var script = document.createElement('script');
    //模仿jQuery 的回调函数
    var call = 'jQuery' + new Date().getTime();
    url = url + '?callback=' + call;
    if (type == "get") { // 通过Get 请求添加附加参数
        url += "&"+dataFomart(data);
        //清空参数
        data = null;
    }
    //通过 script 标签的 src 属性 请求
    script.src = url;
    head.appendChild(script);
    window[call] = function(arg) {
        params.success(arg);
    }
    return;
}

//格式化请求参数
function dataFomart(data) {
    var strs = '';
    for (var vl in data) {
        strs += vl + '=' + data[vl] + '&';
    }
    console.log(strs);
    return strs.slice(0, -1);
}

if (type == "get") {
    url += '?' + dataFomart(data);
    data = null;
}
// ajax 
var xhr = new XMLHttpRequest();

xhr.open(type, url);
if (type == "post") {
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhr.send(dataFomart(data));
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        //解析为json 
        var str = JSON.parse(xhr.responseText);
        params.success(str);
    }
}

};

2 在html 中引用自定义ajax
<script src='ajax.js'></script>
<script type="text/javascript">
var btn = document.querySelector('.btn');

btn.onclick = function() {
    $.ajax({
        url: 'http://www.longtaoge.com/jsonp/demo.php',
        type: 'get',
        data: { name: '小明', age: 12 },
        dataType: 'jsonp',
        success: function(data) {
            console.log(data);
           // 处理返回数据 fillData(data);
        }
    });
}
3 服务器端返回数据
<?php 

   header("Content-type:text/json;charset=utf-8");
   //获取回调方法
   $cal=!empty($_GET['callback'])?$_GET['callback']:'';
   //获取相关参数
   $name=!empty($_REQUEST['name'])?$_REQUEST['name']:"";
   $age=!empty($_REQUEST['age'])?$_REQUEST['age']:"";
   //从文件中取出模似数据
   $va=file_get_contents("./data/data.json");
   $vaObj=json_decode($va);
   //TODO 处理数据
    if (empty($cal)) {
       // 参数
       echo  json_encode($vaObj);
     }else{
        // 跨域回调
      echo $cal.'('.json_encode($vaObj).')';
   }

2. CORS(Cross-origin resource sharing)

CORS是一个W3C标准,全称是”跨域资源共享” , cors 需要浏览器和服务器的支持,现在主流的浏览器均支持这一标准.
服务器端 需要对响应头进行相应的配置实现这一功能

举例说明:在网站 test.com 有一个向 www.longtaoge.com 发起的js简单请求

http://www.test.com/cors/cors.html 

<script type="text/javascript">
var xhr = new XMLHttpRequest;
xhr.open('get', 'http://www.longtaoge.com/cors/cors.php');
xhr.send();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.responseText);
        document.write(xhr.responseText);
    }
}
</script>

直接请求浏览器将提示以下错误信息

cors.html:1 XMLHttpRequest cannot load http://www.homework.com/cors/cors.php. 
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://www.test.com' is therefore not allowed access.

http://www.longtaoge.com/cors/cors.php

可以在响应头中设置 Access-Control-Allow-Origin 实现跨域请求

<?php 
  header('Access-Control-Allow-Origin:http://www.test.com'); //允许 www.test.com 的跨域请求
 //header('Access-Control-Allow-Origin:*');  //允许所有网站的跨域请求
  echo "来自 www.homework.com  的数据 ";

?>

再次访问
CORS

3. 配置apache反向代理实现浏览跨域

1 apache 配置
  • 打开配置文件httpd.conf
  • 开启 proxy_http_module 和 proxy_module 模块,将#号删除

         #LoadModule proxy_module modules/mod_proxy.so
         #LoadModule proxy_http_module modules/mod_proxy_http.so
    
  • 代理详细配置

可以单独为某一个虚拟主机配置反向代理,这样不同的虚拟主机就可以被代理到不同的服务器了

  • 开启辅配置,将#号删除

    #Include conf/extra/httpd-vhosts.conf

  • 配置虚拟主机

    <VirtualHost *:80>
     ServerAdmin 61852263@qq.com
     DocumentRoot "E:/www/test"
     ServerName test.com
     #本服务器域名
     ServerAlias www.test.com 
     ErrorLog "logs/dummy-host.studyit.com-error.log"
     CustomLog "logs/dummy-host.studyit.com-access.log" common
    
    
     ProxyRequests Off
     # 访问/api 相当于访问   http://www.longtaoge.com:80
     ProxyPass /api http://www.longtaoge.com:80
    
     # 这样所有的请求就经过 /api 被代理到  http://www.longtaoge.com:80了
     # /api 也不是固定的,可以自行调整
    

2 html 访问接口
 <script type="text/javascript">
    // 通过服务器代理 相当于访问 http://www.longtaoge.com/jsonp/demo.php
     var url = '/api/jsonp/demo.php';
     var xhr = new XMLHttpRequest();
     xhr.open('get', url);
     xhr.send();
     xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            //解析为json 
            var str = JSON.parse(xhr.responseText);
            console.log(str);
         }
     }
     </script>
3 服务器返回数据
<?php 
header("Content-type:text/json;charset=utf-8");
//模似数据
$va=file_get_contents("./data/data.json");
$vaObj=json_decode($va);
//返回输出
echo  json_encode($vaObj);
从MATLAB代码入手:手把手教你复现OTFS调制解调核心模块(附完整函数解析) 本文详细解析了OTFS调制解调技术在MATLAB中的实现方法,包括核心模块如ISFFT变换、海森堡变换及MP检测算法的代码实现。通过完整的函数解析和性能验证框架,帮助通信工程师快速掌握这一前沿技术,提升在高速移动场景下的通信系统设计能力。 阅读详情

相关推荐

[pcie]gen6 下 L0p

000b~100b: 触发L0p 操作流程协商工作link width 到target link width.为111b:link width 硬件动态调整。硬件动态:Device control 3 register.target link width=111b当pcie链路检测到空闲状态时,设备可以主动进入L0p状态。L0p 是pcie gen6 新引入的链路状态,是L0的子状态。(5)LINK WIDTH:当LINK WIDTH CHANGE.cmd为Request时表示请求的链路宽度。

BIG_APPLE1的博客 1676

九种常见的跨域解决方案(详解)

在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制。同源策略是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

前端工程师 · Vue 生态深耕者,专注多端与工程化 2万+

麒麟V10等保三级配置实战:从auditd规则到PAM锁定的可信基线构建

Linux安全基线是信息系统可信运行的基础能力,其核心在于身份鉴别、访问控制与安全审计三大机制的协同落地。在国产化信创环境中,麒麟V10作为深度适配飞腾/鲲鹏平台的操作系统,其等保三级合规并非简单套用CentOS加固脚本,而是需围绕内核审计(auditd)、可插拔认证模块(PAM)及国产安全增强机制(如kysec)进行精细化编排。技术价值体现在将抽象条款(如GB/T 22239-2019中6.1.2、6.3.3条)转化为可验证的命令行操作,确保登录失败可锁定、关键行为可追溯、时间偏差不致日志失效。典型应用场

weixin_29969209的博客 594

跨域的五种解决方案详解

CORS :全称cross origin resource share (资源共享) 工作原理: 服务器 在返回响应报文的时候,在响应头中 设置一个允许的header

weixin_64214997的博客 2万+

遥感数据处理之MCD19A2数据的处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 这一段时间一直在做modis气溶胶产品——MCD19A2这个数据的处理工作,总结了一些东西,在这里分享一下。 modis数据一般可以用MCTK和MRT这两个工具进行处理,下面先介绍一下用这两种工具处理MCD19A2的流程: 先解众惑:为什么使用MCD19A2数据处理出来的结果会有3个或4个或5个波段。 这里使用HDF Exploer这个软件,下载链接 1.使用MCTK处......

weixin_42176976的博客 1万+

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 542

chartjs更新数据 vue_javascript - Vue-ChartJS数据集不推送更新图表 - SO中文参考 - www.soinside.com...

我正在使用Vue-ChartJS在我的网页上显示图表。因此,当我使用推送功能更新数据集时,图表不会更新(据说它应该更新视图)。使用直接设置到反应变量是更新图表(如this.transaction = Object)。当前ChartComponent的工作方式与此类似,但我希望从API获取数据并将其添加到视图中。Linecartajasaimport { Line, mixins } from 'v...

weixin_32578161的博客 355

Blender关于GIS安装及使用天地图

Blender下载安装及GIS插件的安装及使用

Miss_SQ的博客 6970

跨域9种解决方案

什么是跨域?说起跨域,就要知道什么是浏览器同源策略。浏览器同源策略:必须是协议、域名、端口完全一致的才符合同源策略,如果以上三项,有一项不同都涉及到跨域问题。

欲变世界,先变其身 3万+

关于自制的《航空学报》latex模板(非官网模板)

《航空学报》的官网只提供了word模板,并且该期刊投稿只需要pdf版本不需要源文件。为方便latex爱好者撰写论文,提供该模板及说明给广大科研人士~

qq_37105055的博客 4692

Nacos漏洞利用工具V3.0.5实战:从认证绕开到内存马植入的全流程指南

本文详细解析了Nacos漏洞利用工具V3.0.5在实战中的应用,从认证绕开到内存马植入的全流程。文章深入探讨了如何利用Nacos的历史漏洞,如默认口令、认证逻辑绕过、Derby SQL注入及Jraft反序列化,实现权限提升与持久化控制,并提供了防御视角与加固建议,旨在帮助安全人员理解攻击链以加强防护。

h6j7k8l9p0的博客 483

js跨域的三种方法

跨域 正常情况下,我们使用ajax请求的数据都在自己的服务器上。但在一些特定的场景中,我们需要获取到别人的服务器上的数据,也就是在自己的服务器中的ajax要请求到别人的服务器的网址,这就是跨域。但是浏览器是不允许这样操作的,因为浏览器有同源策略。 同源策略:所谓同源,就是指域名、协议、端口都相同。比如说:在自己的localhost域名下请求www.baidu.com下的内容,这样的协议首先就不同,...

Cobra_boy的博客 4497

手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!!

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。即使是付费帐户,每个月不超过10美刀的费用也非常便宜。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。优点在于,他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。 创建自己的项目,并备份,代码不需要保存在本地或者服务器,GitHub做得非常理想。 学习Git也有很多好处。他被视为一个预先维护过程,你可以按自己

左手の明天的博客 3万+

js中的几种跨域方法

js跨域指的是通过js在不同域之间进行数据传输或通讯,例如ajax通信技术,或者通过js获取页面中iframe的数据。只要有任意一个不同,则协议、域名、端口中有任意一个不同,则彼此成为不同的域。所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子:1)http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域)2)...

michael8512的博客 690

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

解决js跨域问题 .

[size=large] 转载---如何解决js跨域问题 Js跨域问题是web开发人员最常碰到的一个问题之一。所谓js跨域问题,是指在一个域下的页面中通过js访问另一个不同域下 的数据对象,出于安全性考 虑,几乎所有浏览器都不允许这种跨域访问,这就导致在一些ajax应用中,使用跨域的web service会成为一个问题。 解决js跨域问题,目前在客户端和服务端都有一些现成的解决方案,但这些方案...

dreary001的博客 164

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

跨域问题

什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。 什么是JS跨域请求? 一个域上加载的脚本获取或操作另一个域上的文档属性。 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: http://www.123.com/index.html 调用 http://www.1

cristina_song的博客 382

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ajax跨域问题(三种解决方案)

原文连接:https://blog.youkuaiyun.com/u014727260/article/details/72793459为什么会出现跨域跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a...

csdn_cai_csdn的博客 676

js跨域问题小结

js跨域问题小结 javascript出于安全方面的考虑,是不允许跨域调用其他页面的对象的。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。没有记错的话前三届D2论坛上每次都有人提这个东西,这里把涉及到跨域的一些问题简单地整理一下: 首先什么是跨域,简单地理解就是因为javascript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的...

To Be the OnE 178

ajax跨域

ajax有跨域:不同项目名即跨域,ajax解决跨域访问的本质就是java回调js 在跨域请求的时候,如果没有解决shrio是拿不到其他系统的登录信息(可以调用对方项目的方法(ip相同项目名不同)),如果ip也不同那么方法都调用不了 1,jsonp回调 2,Java回调js(jsonp本质) A:   回调的函数服务端也要声明 http://blog.youkuaiyun.com/yttea/ar

yuhui666666的博客 383

到底什么是跨域,如何解决跨域(常见的几种跨域解决方案)?

协议:http://子域名:www子域名:a.com端口号:8080请求资源地址:scripts/jquery.js跨域根本原因是由同源策略引起的。所谓同源是指域名,协议,端口相同,当页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,在请求数据的时候浏览器会在控制台报一个异常,提示拒绝访问。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!跨域访问的例子:请求跨域了,那么请求到底发出去没有?

u011047968的专栏 1万+

跨域的几种常见的解决方式

今天给大家分享一下,修真院官网JSS-5任务中可能会使用到的知识点:1.背景介绍1.1什么是跨域?跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。广义的跨域:1.) 资源跳转: A链接、重定向、表单提交2.) 资源嵌入: link script img frame等dom标签,还有样式中background:url()、@font-face()等文件外链3.) 脚本请求:...

weixin_42039396的博客 3万+

前端跨域的几种方式

前端跨域的几种方式

xinxin7789的博客 1万+

几种常见跨域解决方案

一、同源策略 现在很多的项目开发,都实现了前后端分离开发,能够大大提高效率,但是导致前端向后端发送请求,会出现跨域错误。 先说说什么是跨域当访问一个网站时,一个完整的域名由传输协议、网络名、域名主体和域名后缀四个部分组成,如下图所示: 相同后缀的域名主体是不能重复。http://www.baidu.com和http://www.google.cn就是两个不同的域。跨域就是在当前域去访问其他域的资源。就比如我们在自己的机器上通过ajax去调用百度地图提供的API接口数据,这就是跨域请求。 <!DOCT

江夏、的博客 1628

前端跨域的常见几种解决方案

一、什么是跨域? 在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制。 什么是同源策略? 同源策略是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。 同源策略限制以下几种行为: Cookie、LocalStorage 和 IndexDB 无法读取 DOM和JS对象无法获得

efew212efe的博客 1390

JS 跨域访问的几种方式

JS中的跨域是受到限制的,但是跨域有时候又是必须的,藉此,各种高手牛人想尽办法使得JS能够跨域获取数据,有的方法真的很巧妙 在此记录一下常用的三种跨域方法,如下:   一、不同子域名之间的(a.example.com|b.example.com)的跨域访问。   这种跨域调用比较常见,比如a.example.com 下的 a.htm 页面,需要调用 b.example.com 下的 b.h

享耳三羊 1万+

常见js跨域解决方案

ajax跨域 、uploadify跨域、huploadify跨域、security error、常见js跨域解决方案

思与学的博客 3072
上一篇: 极光示例编译异常
下一篇: docker 官网 出现技术故障
longtaoger
博客等级 码龄13年 7粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值