【taotao】JS跨域

2024-08-25 18:48
文章标签 js 跨域 taotao

本文主要是介绍【taotao】JS跨域,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【跨域概述】
	在JS中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。这一策略对于JS代码
能够访问的页面内容做了很重要的限制,即JS只能访问与包含它的文档在同一域下的内容。因此,也产生了跨域的概
念。
【什么是跨域】
	JS为了安全,有一个限制,不允许跨域访问。
	1. 两个url的域名不同
	2. url相同,域名不同或端口不同
	3. ip不同
	以上三种情况,都属于跨域。
【跨域场景】
	1. 场景描述
	两个工程:
		服务层:taotao-rest:没有表现层,只有业务逻辑。需要发布服务。部署在8081端口
		表现层:taotao-portal:只有表现层,没有业务逻辑,不需要连接数据库。部署在8082端口
	表现层和服务层通信,使用Webservice进行通信。Restful形式的Webservice。http+json数据。
	2. 场景再现
	现需要展示所有商品类目信息,以静态的json数据为例,若该数据在portal项目中,js代码如下:
			
	//访问地址
	URL_Serv: "http://localhost:8082/category.json"
	商品类目展示是没有问题的,
		
	而如果将该json数据放在rest项目中,再通过修改URL_Serv的地址:
		http://localhost:8081/category.json
	这样便不能正常显示数据了,浏览器错误如下:
  
	这就产生了本篇博客要说的跨域问题。下面来看,我们应该如何解决跨域问题。
【解决方案】
	jsonp
	首先我们需要明确,在js中不能跨域请求数据,js可以跨域请求js片段。所以,我们可以将数据包装成js片
段,形成一条方法的调用语句,继续使用ajax请求js片段,得到响应后,在浏览器端的回调方法中通过参数获得请求
的数据。过程如下:
     
	这样我们可以将以上的代码修改为:
		
	//访问地址,URL_Serv:
		
	再访问首页商品类目:
		
【JSONP的产生】
	1. 首先我们应该知道,在web页面上调用js文件则不受是否跨域的影响,而且拥有src属性的标签,如
<script>/<img>/<iframe>,都拥有跨域的能力;
	2. 所以,要是想通过纯web端跨域访问数据只有一种可能,那就是设法把数据装进js文件里,供客户端调用
和进一步的处理;
	3. 恰巧JSON数据格式可以简单地描述复杂数据,而且被JSON支持,所以在客户端便可以任意处理此格式的
数据;
	4. 因此,解决方案就出现了:web端通过调用与脚本一样的方式,去调用跨域服务器上动态生成的js文件
(一般以JSON为后缀)
	5. 客户端在对JSON文件调用成功之后,便获取到了自己所需要的数据,剩下的便可以按照自己的需求去展
示了。
	6. 为了便于客户端使用数据,逐渐形成了一种非正式传输协议,便是JSONP。
【关于JSONP的几个问题】
	1. jsonp跨域只能是get请求,而不能是post请求?
	2. jsonp跨域的原理到底是什么?
	3. 除了jsonp跨域之外还有那些方法绕过“同源策略”,实现跨域访问?
	4. jsonp和ajax,或者说jsonp和XMLHttpRequest是什么关系?
    下面就从jsonp跨域原理说起。
	1、JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。
	2、由第1点,这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了。在没有ajax技术之前,
script标签就存在了的。是因为JQuery的封装,使用了ajax来向服务器传递jsonp和jsonpCallback两个参数。
	3、script,link,img等等标签引入外部资源,都是get请求,那么就决定了jsonp一定是get。但其实上在
代码中写post请求也能成功。这是因为当我们指定dataType:'jsonp',不论指定type:'post'或type:'get',其实质
上都是get请求。
    对应的jquery源码如下:

// Handle cache's special case and global
jQuery.ajaxPrefilter( "script", function( s ) {if ( s.cache === undefined ) {s.cache = false;}if ( s.crossDomain ) {s.type = "GET";s.global = false;}
});

	在ajax的过滤函数中,只要是跨域,jQuery就将其type设置成"GET".

	4、其实除了jsonp跨域之外,还有其它方法绕过同源策略。因为同源是针对客户端的,在服务器端是可以随
便访问的。所以我们可以通过客户端先访问同源的服务端代码,该同源的服务端代码,使用httpClient等方法,再去
访问不同源的服务端代码,然后将结果返回给客户端,这样就实现了跨域。
	5、参数jsonp和jsonCallback
	jsonp指定使用哪个名字将回调函数传给服务端,也就是在服务端通过request.getParameter("")获得的名
字,而jsonpCallback是对应的值,也就是回调函数的名称。其实这两个参数都可以不指定,只要我们是通过
success,来指定回调函数的情况下,默认就是“callback”。JQuery对应源码如下:

var oldCallbacks = [],rjsonp = /(=)\?(?=&|$)|\?\?/;// Default jsonp settings
jQuery.ajaxSetup({jsonp: "callback",jsonpCallback: function() {var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );this[ callback ] = true;return callback;}
});

【总结】

	跨域,经常会遇到的问题。之前的学习还没有到此阶段,所以总是选择避免这样的问题。而现在,学习积累
到了一定阶段,就有了第一次的接触,学习到了其中的一种解决方案jsonp。从遇到的问题出发,到给出解决方案,
这一过程的学习很充实。并且,解决的方案并不仅仅有jsonp哦。


这篇关于【taotao】JS跨域的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106361

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放