分布式项目10. js中src进行服务器之间的访问和优化使用jsonp的ajax请求处理访问

news2024/11/25 1:57:30

一般使用ajax来访问不同服务器的数据,可行吗?
做个实验:
第一步:在本服务器中使用ajax技术访问本服务器数据

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-
1.4.1/jquery.min.js"></script>
<script type="text/javascript">
//让页面加载完成后执行该函数
$(function(){
$.get("http://manage.jt.com/test.json",function(data){
alert(data.name);
})
})
</script>
</head>
<body>
<h1>JSON跨域请求测试</h1>
</body>
</html>

test.json的内容是:

{"id":"1","name":"tom"}

在这里插入图片描述
结论:本地服务器访问本地服务器数据http://manage.jt.com/test.json,可以正常访问。

第二步:Ajax远程服务器调用
说明: 由www.jt.com发起请求,请求manage.jt.com中的test.json数据,测试是否成功!!!

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-
1.4.1/jquery.min.js"></script>
<script type="text/javascript">
/*$(){}结构必然是jQuery函数类库导入后才能正确执行*/
$(function(){
alert("我执行了AJAX");
//利用jQuery发起AJAX请求
$.get("http://manage.jt.com/test.json",function(data){
alert(data.name);
})
})
</script>
</head>
<body>
<h1>JSON跨域请求测试</h1>
</body>
</html>

访问www.jt.com.test.html
在这里插入图片描述
结论:
1.发现由www.jt.com向manage.jt.com发起请求时,并没有获取到结果。
2.浏览器居然访问后台服务器数据成功了状态码200
在这里插入图片描述

3.浏览器虽然访问成功,不能获取响应数据.
那这是因为什么原因呢?就是跨域的问题
浏览器—同源策略

说明:浏览器规定当发起请求时,要求 协议名称://域名:端口三项都相同,满足同源策略的规定,浏览器可以正
常解析服务器数据。如果有一项不满足,则违反了浏览器的同源策略,那么浏览器可以正常请求数据,但是不予
解析返回值(处于安全性的考虑)。

在这里插入图片描述
利用JSONP实现跨域的基本原理

javaScript中src说明:
浏览器由于同源策略的限定,禁止ajax发起跨域请求.但是javaScript中的src属性可以实现跨域的请求. 浏
览器对于src属 性具有开放策略.(不管)
想法: 能否利用javaScript中的开放策略,实现跨域访问???

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript">
/*自定义回调函数 */
alert("开始跨域访问")
function hello(data){
alert(data.name);
}
</script>
<!--该json一直保存到浏览器中等待调用,但是没有函数名称无法调用 -->
<script type="text/javascript" src="http://manage.jt.com/test.json">
</script>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-
1.4.1/jquery.min.js"></script>
</head>
<body>
<h1>JS跨域问题</h1>
</script>
</body>
</html>

此时在manage.jt.com中的资源需要进行封装
原来的test.json是:

{"id":"1","name":"tom"}

现在的test.json是:(需要的是hello封装json数据后,回调函数function hello(data){}才可以调用资源对象)

hello({"id":"1","name":"tom"})

结果是可以的

跨域原理总结:

1.利用javeScript中的src属性,实现跨域
<script>type="text/javascript"src="http://manage.jt.com/test.json"></script>
2.自定义回调函数
说明:利用src属性引入数据之后,页面要想调用,需要通过函数名称,才能正确调用!
/*自定义回调函数 并且给函数起的名称叫hello */
function hello(data){
alert(data.name);
}
解释: 自定义回调函数的目的就是为远程调用的数据起名.
3.远程调用的返回值经过特殊的格式封装 "callback(JSON)"
callback指定是回调函数的名称.可以灵活改变,此时的资源封装结果是:
hello({"id":"1","name":"tom"})

JSONP介绍
JSONP(JSON with Padding)(JSON胖)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是server1.example.com的服务器沟通,而 HTML 的 元素是一个例外。利用 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。

JSONP原理
ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进
行了调用,这样实现了跨域。

jQuery实现JSONP
页面实现:
jsp页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSONP测试</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-
1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
alert("测试访问开始!!!!!")
$.ajax({
url:"http://manage.jt.com/web/testJSONP",
type:"get", //jsonp只能支持get请求
dataType:"jsonp", //dataType表示返回值类型
//jsonp: "callback", //指定参数名称,也就是封装的函数名默认是callback
//jsonpCallback: "hello", //指定回调函数名称
success:function (data){ //data经过jQuery封装返回就是json串
alert(data.itemId);
alert(data.itemDesc);
}
});
})
</script>
</head>
<body>
<h1>JSON跨域请求测试</h1>
</body>
</html>

说明:启动jt-web服务器,然后打来浏览器,访问:http://www.jt.com/JSONP.html

编辑jt-mange后台服务器
说明:在后台服务器中创建对应的controller资源进行资源调度,从而去处理由前台发起的ajax跨域请求,进行数据的获取,具体代码实现如图所示:

传递一个item对象过去

@RestController
public class JSONPController {
/**
* 需求:跨域访问,获取商品的详情信息
* http://manage.jt.com/web/testJSONP?callback=xxx
* 参数:?callback=xxx
* 返回值语法规定: callback(json数据);
*/
@RequestMapping("/web/testJSONP")
public String testJSONP(String callback) {
ItemDesc itemDesc=new ItemDesc();
itemDesc.setItemId(100L).setItemDesc("JSONP跨域测试");
//将对象转化为JSON
String json = ObjectMapperUtil.toJSON(itemDesc);
//将数据封装
return callback+"("+json+")";
}
}

说明:打开浏览器,输入http://www.jt.com/JSONP.html,开始测试:

结论:利用JSONP进行跨域请求,是可以获取到数据的。

JSONP工具API—JSONPObject
需求:由于使用JSONP进行跨域请求时,需要我们手动进行数据的封装,才可以实现跨域请求。因此为了提高开发效率,我们可以使用工具api简化开发。具体实现如下代码所示:

@RestController
public class JSONPController {
/**
* 1.定义返回值结果 JSONPObject
* 2.实现数据的封装 参数1:回调函数 参数2:后台服务器返回数据
* @param callback
* @return
*/
@RequestMapping("/web/testJSONP")
public JSONPObject jsonp2(String callback) {
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(200L)
.setItemDesc("JSONP调用成功!!!!");
return new JSONPObject(callback, itemDesc);
}
}

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

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

相关文章

【SpringMVC】SpringMVC的入门程序——HelloWorld(有点详细)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

GP05丨多因子IC对冲

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;今天我们分享股票社群第5期量化策略——多因子IC对冲。 在前几期中&#xff0c;我们分享了GP01多因子、ETF轮动策略及Plus版本、网格等等。本期我们继续分享多因子策略。 策略背景与…

大数据治理入门系列:数据血缘关系

血缘关系在人类社会中扮演着重要角色。大多数家庭是基于血缘关系形成的&#xff0c;而家庭作为社会的基本单元&#xff0c;对维系社会稳定发挥着重要关系。其实&#xff0c;数据之间也存在类似的血缘关系。数据从产生、加工、流转&#xff0c;一直到消亡&#xff0c;每个环节必…

为什么要分库分表?

不急于上手实战 ShardingSphere 框架&#xff0c;先来复习下分库分表的基础概念&#xff0c;技术名词大多晦涩难懂&#xff0c;不要死记硬背理解最重要&#xff0c;当你捅破那层窗户纸&#xff0c;发现其实它也就那么回事。 什么是分库分表 分库分表是在海量数据下&#xff0…

【新星计划·2023】TCP协议与UDP协议讲解

前言 对于TCP协议与UDP协议&#xff0c;大家应该都有所耳闻。我们常用的网络通讯&#xff0c;比如浏览网页&#xff0c;软件聊天&#xff0c;都是通过这两种协议来进行数据传输的&#xff0c;下面我就来给大家讲解一下这两个协议。 一、什么是TCP、UDP TCP(Transmission Con…

什么是接地电阻?如何测量防雷接地电阻

防雷工程里经常出现“接地”这个词。 这种称为“接地”的布线&#xff08;施工&#xff09;旨在减少电能泄漏到使用电力的设备等原始路线外&#xff08;泄漏时&#xff09;对周围财产和人体的影响。 此外&#xff0c;为了可靠地工作设备&#xff0c;以检测漏电断路器&#xff…

股东刚减持,股价却起飞?用Python量化A股解禁数据,利空出尽是利好? | 邢不行

2019年6月11日&#xff0c;宁德时代上市一周年之际&#xff0c;有45%的股票迎来了解禁。 这些由大股东、高管、早期投资者持有的股份&#xff0c;原先无法交易&#xff0c;但从这一天起就可以自由卖出了。 很多人出于对解禁后巨大卖盘的担忧纷纷提前卖出&#xff0c;导致宁德时…

linux查看服务端口命令大全

目录&#xff1a; 零、 linux怎么查看所有服务端口一、常用命令二、lsof -i 需要 root 用户的权限来执行三、netstat命令四、扩展资料 零、 linux怎么查看所有服务端口 1、打开linux系统&#xff0c;在linux的桌面的空白处右击。 2、在d出的下拉选项里&#xff0c;点击打开终端…

责任链模式-参数校验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、责任链模式概念二、责任链模式主要应用场景三、责任链模式的优点四、责任链模式的缺点五、场景案例&#xff1a;参数校验1.UML图2.代码实现2.1.请求体定义2…

【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

day16 - 提取图像前景

在我们平时使用购物软件是会发现通常在搜索框右侧都会有一个相机的标志&#xff0c;这个标志是可以让用户通过图片来搜索自己需要购买的内容。拍照购物将用户拍摄的商品与商品图库的图像进行对比&#xff0c;找到最为相似的商品。但是由于用户拍摄的图像是任意的随机的&#xf…

使用Arcgis免费获取全国地质数据

使用Arcgis免费使用全国地质数据 如今是大数据并发的时代&#xff0c;并且还是数据大开放的时代。全国地质资料馆开放了大量的地质资料数据&#xff0c;供全民使用。今天我在这里教大家使用免费的数据&#xff0c;帮助我们工作。 全国地质资料馆地址&#xff1a; http://www.ng…

基于广义Benders分解法的综合能源系统优化规划(matlab程序)

目录 1 主要内容 广义benders分解法流程图&#xff1a; 优化目标&#xff1a; 约束条件&#xff1a; 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《综合能源系统协同运行策略与规划研究》第四章内容基于广义Benders分解法的综合能源系统优化规划&…

图学习 [1]

图学习 [1] 图学习的主要任务 节点预测。节点预测任务是指利用图结构中已有的节点和边信息&#xff0c;通过机器学习算法对图中新添加的节点进行分类或回归预测的任务。链路预测。链路预测任务是指利用图结构中已有的节点和边信息&#xff0c;通过机器学习算法预测未来可能存…

【C++初阶】友元 + 内部类 + 匿名对象

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

欢迎所有用户! Elastic 扩展知识中心和支持中心

作者&#xff1a;Cory Mangini 对于所有云用户&#xff0c;我们有一些好消息&#xff1a;你现在可以访问我们的知识中心&#xff0c;在云试用期间请求技术支持&#xff0c;并通过 Elastic Support Hub 提出账单案例。 这意味着你可以利用我们的 Elasticians 多年来积累的丰富知…

基于html+css的图展示90

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

day20 - 绘制物体的运动轨迹

在我们平常做目标检测或者目标追踪时&#xff0c;经常要画出目标的轨迹图。绘制轨迹图的一种方法就是利用光流估计来进行绘制。 本期我们主要来介绍视频中光流估计的使用和效果&#xff0c;利用光流估计来绘制运动轨迹。 完成本期内容&#xff0c;你可以&#xff1a; 掌握视…

通过js来判断是否是横屏如果是就自刷新页面解决横屏之后只有屏幕一半宽度的问题

判断页面是横屏还是竖屏 window.addEventListener("load", rotate, false);window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", rotate, false);function rotate() {if (window.orientatio…

首个机器学习实时特征平台测试基准论文被 VLDB 2023 录取

国际顶级数据库学术会议 VLDB 2023 将于 2023 年 8 月份在加拿大温哥华举办。近日&#xff0c;由清华大学、新加坡国立大学、以及 OpenMLDB 社区联合完成的科研成果 - 业界第一个严谨的机器学习实时特征平台测试基准&#xff0c;被大会录取并且受邀在现场报告。论文题目为&…