参考链接:https://www.cnblogs.com/xiaoxiaoccaiya/p/7088176.html
https://blog.csdn.net/jlin991/article/details/56846190
1、什么是跨域
简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。
具体策略限制情况可看下表:
URL | 说明 | 允许通信 |
http://www.a.com/a.js http://www.a.com/b.js |
同一域名下 | 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js |
同一域名下不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js |
同一域名,不同端口 | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js |
同一域名,不同协议 | 不允许 |
http://www.a.com/a.js http://127.0.0.100/b.js |
域名和域名对应ip | 不允许 |
http://www.a.com/a.js http://script.a.com/b.js |
主域相同,子域不同 | 不允许 |
http://www.a.com/a.js http://a.com/b.js |
同一域名,不同二级域名(同上) | 不允许 |
http://www.a.com/a.js http://www.b.com/b.js |
不同域名 | 不允许 |
2、什么是JSONP?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,而JSONP(JSON with Padding)则是JSON 的一种“使用模式”,通过这种模式可以实现数据的跨域获取。
3、JSONP跨域的原理
在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img、iframe、script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。利用script标签的开放策略,我们可以实现跨域请求数据,当然,也需要服务端的配合。当我们正常地请求一个JSON数据的时候,服务端返回的是一串JSON类型的数据,而我们使用JSONP模式来请求数据的时候,服务端返回的是一段可执行的JavaScript代码。
余理解:ajax不允许跨域访问json数据,但是允许跨域访问js。故将原数据包装到js语句里面,一起返回给浏览器。
举个例子,假如需要从服务器(http://www.a.com/user?id=123)获取的数据如下:
- {"id": 123, "name" : 张三, "age": 17}
那么,使用JSONP方式请求(http://www.a.com/user?id=123?callback=foo)的数据将会是如下:
- foo({"id": 123, "name" : 张三, "age": 17});
当然,如果服务端考虑得更加充分,返回的数据可能如下:
- try{foo({"id": 123, "name" : 张三, "age": 17});}catch(e){}
这时候我们只要定义一个foo()函数,并动态地创建一个script标签,使其的src属性为http://www.a.com/user?id=123?callback=foo:
便可以使用foo函数来调用返回的数据了。
4、我的测试代码
亲测可行
5、spring4.1之后提供了工具类MappingJacksonValue对返回数据进行封装;
@RequestMapping(value = "item/list", produces = MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8") @ResponseBody public Object getCrossData(String callback) { MyResult result= myService.getDataList(); MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result); mappingJacksonValue.setJsonpFunction(callback); return mappingJacksonValue; }
6、解决跨域问题,cors访问也是不错的选择。
这里有一篇相当详尽移动的文章:
http://www.ruanyifeng.com/blog/2016/04/cors.html
讲解跨域访问时,如何设置”Access-Control-* “的值、简单请求(simple request)和非简单请求(not-so-simple request)... .. 等等。
个人感觉比jsonp好用。
相关推荐
ssm跨域问题解决方案
本篇文章将详细介绍如何解决Geoserver的跨域问题。 首先,我们需要理解跨域问题的背景。根据同源策略,浏览器只允许与同一源(协议+域名+端口)的请求进行通信。但在实际应用中,比如一个网站前端和Geoserver不在同...
为了解决这个问题,润乾报表提供了一种解决方案,即通过设置`document.domain`属性来实现跨域资源共享(CORS)。首先,需要确保在web.xml配置文件中使用域名而不是IP地址,例如将`reportPath`的值改为`...
**WCF服务宿主及其跨域问题解决实例** 在分布式系统开发中,Windows Communication Foundation (WCF) 是Microsoft提供的一种强大的服务导向架构,用于构建高度互操作的服务。本实例主要探讨的是如何在Silverlight...
本文将详细介绍 Vue 跨域问题的解决方案,包括使用 Vue-cli 搭建项目、使用 axios 进行 ajax 请求、使用 proxyTable 代理解决跨域问题,以及使用 nginx 解决线上跨域问题。 一、 Vue-cli 搭建项目 使用 Vue-cli ...
Nginx 跨域问题解决方案 Nginx 是一个流行的开源 Web 服务器软件,广泛应用于 Web 服务器管理。然而,在使用 Nginx 进行服务器管理时,经常会遇到跨域问题。跨域问题是指在不同的域名、端口或协议下,无法访问...
解决arcgis server跨域问题: 1、停掉ArcGIS Server的服务。 2、 打开<ArcGIS Server> \framework\runtime\tomcat\conf\web.xml,注册跨域bean 3、lib下拷贝 cors-filter-2.5.jar java-property-utils-1.9.1.jar包 4...
Tomcat跨域解决方案通常涉及添加CORS过滤器。CORS Filter是一个可以处理HTTP响应头,以允许跨域请求的组件。下载并导入`CORS.jar`到Tomcat的`lib`目录。 2. **配置web.xml**: 打开`conf/web.xml`文件,添加以下...
本文旨在详细阐述CORS跨域问题的背景、解决方法以及如何在Spring Boot和Vue.js的结合使用场景下处理跨域问题。 ### CORS跨域问题背景 CORS全称是Cross-Origin Resource Sharing,即跨源资源共享。这个概念是W3C的...
Vue+SpringBoot前后端分离工程跨域问题解决方案解析 本文主要介绍了Vue+SpringBoot前后端分离工程跨域问题解决方案解析,通过示例代码详细介绍了跨域问题的解决方案,对大家的学习或者工作具有一定的参考学习价值。...
### Ajax跨域问题解决方案 #### 一、什么是Ajax跨域 **原理:** Ajax跨域问题的核心在于浏览器的“同源策略”。同源策略是一种安全措施,用于限制一个域名下的文档或脚本如何与另一个来源的资源进行交互。简单来说...
nginx跨域问题解决
选择哪种跨域解决方案取决于应用场景和需求。JSONP适用于简单的GET请求,CORS是现代浏览器推荐的通用方案,代理服务器适用于复杂的后端集成,`document.domain`适用于同一顶级域名下的跨子域,`postMessage`适合页面...
### uni-app运行到浏览器跨域H5页面的跨域问题解决方案 #### 一、背景介绍 在使用uni-app开发移动应用或H5页面时,开发者可能会遇到跨域问题。跨域问题是前端开发中的常见问题之一,主要是由于浏览器的同源策略所...
### Tomcat跨域解决方案 #### 一、背景与问题描述 在现代Web开发中,由于浏览器的安全策略限制,不同源之间的资源访问会受到限制,这种现象被称为“同源策略”(Same-Origin Policy)。同源策略是为了保护用户数据...
这是目前最常用的跨域解决方案之一,主要通过在服务端添加CORS(Cross-Origin Resource Sharing)配置来实现。 - **服务端配置示例**(Java): ```java @Configuration public class CorsConfig implements ...
但这种方法需要服务器端的配合,对于纯客户端的iframe跨域解决方案不适用。 **三、window.name跨域通信详解** 1. **原理**:`window.name`不受同源策略限制,可以在任何页面中读写,即使页面被刷新或导航至其他URL...
前端跨域问题解决
为了节约成本,很多时候一台server 的nginx可能要部署多个前端的情况,本实例是在docker环境下部署两个前端,同时处理前端调用后端跨域问题,本示例为阿里云centos7 系统docker20.10.6环境下nginx1.19.5版本 ...
Spring Cloud Gateway 请求跨域问题解决方案 Spring Cloud Gateway 作为一种基于微服务架构的API Gateway,提供了许多有用的特性,如路由、负载均衡、熔断器等。但是,在使用 Spring Cloud Gateway 时,经常会遇到...