Ajax学习:解决跨域_JSONP

news2024/11/16 21:29:02

JSONP:非官方的跨域解决方案,纯粹依靠程序员的聪明才智,只支持get请求

JSONP是怎么工作的:再页面中有一些标签天生具有跨域能力,就像是link,img,iframe,script

        JSONP就是利用script标签的跨域能力来发送请求


如下所示:是跨域请求:源是file协议 路径是本地地址  目的是:http协议 域名和路径都他他不一样

使用的是 script标签

 

 


使用 script标签(原理)

const data={
    name:'张三'
};
console.log(data)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="./app.js"></script>
</body>
</html>

 使用file协议发起请求:这时候script请求的js也是file协议的

使用http协议访问 这时候访问的资源app遵循的也是http协议

 

 

 这时候使用此http协议的url网址:代替原先的路径

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #result {
            width: 300px;
            height: 100px;
            border: solid 1px #890;
        }
    </style>
</head>

<body>
    <div id="result"></div>
    <script>
        //处理数据
        function handle(data) {
            //获取result元素
            const result = document.getElementById('result');
            result.innerHTML = data.name;
        }
    </script>
    <!-- js返回结果是数据外加函数调用 -->
    <script src="http://127.0.0.1:8848/ECMAScript6-11/Ajax/%E5%8E%9F%E7%94%9Fajax/%E8%B7%A8%E5%9F%9F/app.js"></script>
 
</body>

</html>

js部分 

const data={
    name:'张tt三'
};

handle(data)

这时候使用本地资源打开此页面,访问成功:也就是使用file协议 使用script标签 访问的资源是http协议:跨域成功(实现了script跨域实现跨域)

返回的数据是数据和函数调用,script标签做解析处理,然后在html页面显示


script发送跨域请求,返回的结果是函数调用的内容==js代码,这样才可以被前端引擎解析使用

服务器端 

const { json } = require('express');
const express=require('express')

const app=express();
app.get('/home',function(requset,response){
    //设置响应头 名称 值----设置允许跨域
   // response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.sendFile(__dirname+'/同源策略.html');//绝对路径
})
app.get('/data',function(requset,response){
    //设置响应头 名称 值----设置允许跨域
   // response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('用户数据');//绝对路径
})
app.get('/jsonp',function(requset,response) {
    response.send('console.log("jsonp")');
    
})
app.listen(9000,()=>{
    console.log('9000启动成功')
})

html端:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #result {
            width: 300px;
            height: 100px;
            border: solid 1px #890;
        }
    </style>
</head>

<body>
    <div id="result"></div>
    <script>
        //处理数据
        function handle(data) {
            //获取result元素
            const result = document.getElementById('result');
            result.innerHTML = data.name;
        }
    </script>
    <!-- js返回结果是数据外加函数调用 -->
   <script src="http://127.0.0.1:9000/jsonp"></script>
</body>

</html>

如果返回的不是js语句体,就会出错(因为使用script标签发起请求,js引擎无法解析非js代码) 

 服务器如果返回script的结果是 函数调用结果(js代码)


app.get('/jsonp',function(requset,response) {
 
   const data={
       name:'张三啊'
   };
   //将数据转化为字符串
   let str=JSON.stringify(data);
   //返回结果 不可以是数据 j代码 end防止添加不知名的响应头
   //``模板字符串 方便拼接
   response.end(`handle(${str})`)
     
})

 返回结果是函数调用,函数的参数就是想给客户端的结果数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计毕业生就业管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Docker】Docker常用命令(包含Dockerfile指令)

目录一.Docker常用命令1.帮助命令2.镜像命令3.容器命令4.其他常用命令5.更多更详细命令二.Dockerfile常用指令1.常用指令2.CMD 和 ENTRYPOINT 的区别一.Docker常用命令 1.帮助命令 # docker version //查看docker版本号 # docker info //查看docker的系统信息…

外贸员的日常工作分享

外贸人米贸搜的日常工作流程为你整理如下。希望能帮到你: 外贸业务员的职责 一、业务人员在向国外买家询价前&#xff0c;要了解客户的基本信息&#xff0c;包括是否是终端客户&#xff0c;年采购量&#xff0c;消费区域&#xff0c;产品的用途&#xff0c;规格&#xff0c;质…

(附源码)SSM座位管理系统 毕业设计 250858

基于SSM的座位管理系统 摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于学校的各种信息管理也是十分常见的。过去使用手工的管理方式对高校教室座位进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用…

python的opencv使用总结

作为最容易上手之一的语言&#xff0c;python拥有着大量的第三方库&#xff0c;这些第三方库的存在使得很多人可以专注于业务逻辑、数学逻辑而忽略繁琐的代码操作&#xff0c;python的opencv第三方库就是其中之一。 一、第三方库的安装和简单使用 安装 简单的pip安装就可以了…

【雷达波位编排】基于matlab相控阵雷达的波位编排仿真【含Matlab源码 2251期】

⛄一、相控阵雷达最优波位编排策略仿真算法 1 波位编排的最优化 相控阵雷达的扫描空域一般在修正球坐标系下进行指定,它的坐标原点为雷达站,雷达阵面法线在水平面的投影作为方位角的零度,顺时针为正,逆时针为负,有效取值范围为[-π/2,π/2],以水平面作为俯仰角的零度,向上为正…

分享5款2023年不容错过的宝藏软件

今天带来五款宝藏软件&#xff0c;身为宝藏男孩和宝藏女孩的你们&#xff0c;不试一下吗&#xff1f; 1.EPUB阅读器——Starrea Starrea 是一款Windows平台的EPUB电子书阅读器&#xff0c;它虽然只支持一个平台&#xff0c;但是提供了很多额外的功能&#xff0c;其中包括 文…

MySQL学习笔记(十)crash-safe 和两段提交

crash-safe CrashSafe指MySQL服务器宕机重启后&#xff0c;能够保证&#xff1a; 所有已经提交的事务的数据仍然存在。所有没有提交的事务的数据自动回滚。 如果MySQL宕机了&#xff0c;重启后&#xff0c;就需要检查redolog 日志文件里面&#xff0c;系统会自动定位到上次c…

Jmeter插件duang duang duang 学会模拟各种场景

为什么要使用jmeter线程组插件呢&#xff1f; jmeter自带的线程组插件模拟的压测场景非常有限&#xff0c;当需要模拟复杂压测场景的时候&#xff0c; 推荐大家使用jmeter线程组插件。 如何下载jmeter线程组插件呢&#xff1f; 早期版本的jmeter可以针对我们需要的扩展功能&…

解决远程连接 docker中mysql 失败

在docker安装好mysql之后 端口也设置好&#xff0c;同时云服务器的端口3306也打开。但是使用navicat 连接不上。 其实是因为Navicat只支持旧版本的加密,需要更改mysql的加密规则 进入MySQL容器,登陆MySQL docker exec -it mysql /bin/bash 登陆mysql** mysql -u root -p 输入密…

炫龙T6-E7A2电脑如何U盘重装系统解决系统故障教学

炫龙T6-E7A2电脑如何U盘重装系统解决系统故障教学。对于一些比较严重的系统故障问题来说&#xff0c;普通用户很难去进行问题的解决。比如系统故障导致无法开机&#xff0c;普通用户无法自己解决问题&#xff0c;这个时候可以通过U盘重装系统的方法来解决&#xff0c;这个方法还…

深入URP之Shader篇2: 目录结构和Unlit Shader分析[上]

Unity和URP版本 我使用的Unity版本为2020.3.33f1&#xff0c;对应的URP和SRP Core版本为10.8.1。阅读URP源码建议把package从Library/PackageCache中拷贝到Packages目录&#xff0c;也就是自定义package的方式&#xff0c;然后推荐使用VS code打开工程&#xff0c;这样可以很方…

Golang【Web 入门】 08 集成 Gorilla Mux

阅读目录集成 Gorilla Mux为什么不选择 HttpRouter&#xff1f;安装 gorilla/mux使用 gorilla/mux迁移到 Gorilla Mux1. 新增 homeHandler2. 指定 Methods () 来区分请求方法3. 请求路径参数和正则匹配4. 命名路由与链接生成集成 Gorilla Mux 我们将选用 gorilla/mux 来作为 g…

CSS页面布局(超详解)

目录 1 CSS页面布局概述 1.1 概述 1.2 网页栏目划分 1.3 元素类型转化 1.3.1 块元素 1.3.2 行内元素 1.3.2 块元素和行内元素的转换 1.4 定位 1.4.1 静态定位 1.4.2 相对定位 1.4.3 绝对定位 1.4.4 固定定位 1.4.5 定位元索的层叠次序 1.5 浮动 1.5.1 概述 1.5…

JAVA中如何精确取到时间

文章目录0 写在前面1 使用方法2 举例3 写在最后0 写在前面 做业务的时候&#xff0c;总要统计数据&#xff0c;几月份到几月份的全部数据。这个时候就要找到起始月份的具体时间和终止月份的具体时间。 此时我们用原始的Date类去处理就比较麻烦&#xff0c;可以自己写一个工具类…

Web3中文|什么是以太坊虚拟机(EVM),它是如何工作的?

来源 | cointelegraph 编译 | DaliiNFTnews.com 以太坊已成为仅次于比特币的第二重要区块链。以太坊能发展得这么好&#xff0c;它的原生Solidity编程语言和以太坊虚拟机&#xff08;EVM&#xff09;发挥了重要的作用。 以太坊区块链凭借自身拥有的灵活性、大量可用的开发工…

MySQL高级SQL语句

一.准备 mysql -uroot -p123123create database train_ticket; #创建库use train_ticket; create table REGION(region varchar(10),site varchar(20)); create table FARE(site varchar(20),money int(10),date varchar(15)); #创建表desc REGION; desc FARE; #查看表结构ins…

[附源码]计算机毕业设计云南美食管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

浅析linux内核网络协议栈--linux bridge(二)

6. 网桥数据转发 6.1 网桥数据包入口 网桥是一种2层网络互连设备&#xff0c;而不是一种网络协议。它在协议结构上并没有占有一席之地&#xff0c;因此不能通过向协议栈注册协议的方式来申请网桥数据包的处理。相 反&#xff0c;网桥接口&#xff08;如上述的eth1&#xff09…

mysql—MHA原理与实现

官方介绍&#xff1a;https://code.google.com/p/mysql-master-ha/ MySQL复制集群中的master故障时&#xff0c;MHA按如下步骤进行故障转移&#xff1a; 从上图可总结MHA工作步骤为&#xff1a; -从宕机崩溃的master保存二进制日志事件(binlogevents)。 -识别含有最新更新的s…