javascipt 跨域资源共享、JSONP

2024-06-06 08:08

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

跨域资源共享

通过XMLHttpRequest实现ajax通信的时候有一个主要限制,来自于跨域安全策略。默认情况下,xhr对象只能访问到与包含它的页面位于同一个域中的资源。如果请求目标跨域,则会出现跨域问题:
(同一域名不同端口)
下面的表格描述了在不同情况下允不允许跨域的情况:

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://70.32.92.74/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
同一域名,不同二级域名(同上)不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名不允许

(来自http://www.360doc.com/content/14/0522/23/9200790_380060755.shtml)

CORS(跨域资源共享)定义了在必须访问跨域资源时,浏览器和服务器应该如何沟通。CROS背后的思想就是使用自定义的HTTP头部让浏览器和服务器沟通,从而决定请求是否成功。
当浏览器给服务器发送请求时,其请求头部会包含一个头部信息:

Origin:http://localhost:63342

这时,如果想让服务器接受这个请求,应该在Access-Control-Allow-Origin头部中回发想通的源信息,如:

Access-Control-Allow-Origin: http://localhost:63342

如果想让任意域名都能访问,则可设置成*,以sevlet为例,调用response的setHeader即可:

response.setHeader("Access-Control-Allow-Origin", "*");

这样ajax再请求这个域名就不会出现跨域错误了。

JSONP

在CORS出现之前,也有很多办法实现跨域通信,JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,利用了DOM中能够执行跨域请求的功能,在不依赖XMLHttpRequest对象的情况下也能发送某些请求。
因为script标签是可以跨域请求资源的,比如你能在localhost:8080/a.html里面去请求别的域名的文件比如<script src="http://code.jquery.com/jquery-1.11.1.min.js">
那么,又因为是脚本请求,服务器返回的数据是立即执行的,比如如果服务器返回的数据是alert(“hello”),那么客户端就会弹一个hello出来,如下
Javascript:

var script = document.createElement("script");
script.src = "http://localhost:8080/SaleHouse/Test";
document.body.appendChild(script);

服务器:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("alert('hello')");
}

执行js代码后,弹出hello对话框。
利用这一特性,我们可以让服务器将数据包装成一个函数,然后将服务器要传的数据传递到这个函数中,而这个数据用json格式是最合适不过了,像这样:

response.getWriter().write("handleResponse({'name':'zhangsan','age':'18'})");

这时,客户端请求到数据后会立即调用handleResponse方法,但是我们没有,没有就写一个呗

function handleResponse(resp){//处理服务器的响应console.log(resp.name + ":" + resp.age);
}
var script = document.createElement("script");
script.src = "http://localhost:8080/SaleHouse/Test";
document.body.appendChild(script);

为了处理更多数据,我们可以将函数名也作为参数传递给服务器,服务器动态返回要执行的函数,这就是JSONP。
Javascript:

function handleResponse(resp){//处理服务器的响应console.log(resp.name + ":" + resp.age);
}
var script = document.createElement("script");
//callback指定回调函数名
script.src = "http://localhost:8080/SaleHouse/Test?callback=handleResponse";
document.body.appendChild(script);

服务器:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String callback = request.getParameter("callback");response.getWriter().write(callback + "({'name':'zhangsan','age':'18'})");
}

这篇关于javascipt 跨域资源共享、JSONP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap