ajax 跨域请求jsonp
最近一段时间为这个事情走了不少弯路,现将成功经验分享,避免后来人再绕远路,不过也是第一次使用中间有什么问题大家可以留言探讨。
ajax的跨域请求jsonp主要运用于不同系统的交互,一个系统想通过该种方式发送一个数据,获得该数据在另一个系统的想对应数据的过程。
主要代码实现example:
        $.ajax({
		    url: url,
		    type: 'GET',
		    dataType: 'jsonp',
		    async:false,
		    jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
                 jsonpCallback: "jsonpcallback",//自定义的jsonp回调函数名称,注意和后台保持一致,否则会走error报textstauts:parsererror 格式错误
		    timeout : 40000,
                 success: function(data){
		        alert(data.returnFlag+"&&"+data.taskid);
		    },		
		    error: function(XMLHttpRequest, textStatus, errorThrown) {
		    	 alert(XMLHttpRequest.status);
		    	 alert(XMLHttpRequest.readyState);
		    	 alert(textStatus);
		    }
		});
后台action代码:
public void receivePort(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{
		String title,taskid,creator,task_sys_sendid,task_sys_source,deptname,remark,source;
		String jsonpcallback = request.getParameter("callback"); // 注意与ajax保持一致
		jsonpcallback = jsonpcallback == null ? "" : jsonpcallback;
          response.setContentType("application/x-javascript");
             response.setCharacterEncoding("UTF-8");
             response.setHeader("P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");  
            PrintWriter out;
		try {
			out = response.getWriter();
		     out.write("jsonpcallback({ \"returnFlag\":" + bln + ",\"taskid\":\"" +taskid.toString()+ "\"});");  //格式注意
		        out.flush();
		        out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}  
	}
这样就可以实现跨域请求数据了。
过程错误总结:
1、报错:textstauts:parsererror →页面控制台打印Uncaught SyntaxError: Unexpected token
对比前后代码,只因为在jsonp中缺少了空格!!!此处要谨慎!

题外话:
1、XMLHttpRequest().readyState的五种状态详解 .(抄录)
(0)未初始化
此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在,否则浏览器会报错--对象不存在。
(1)载入
此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。
(2)载入完成
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。
(3)交互
此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。状态3表示正在解析数据。
(4)完成
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。
概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:
创建-初始化请求-发送请求-接收数据-解析数据-完成
在具体应用中,明确了readyState的五个状态(XMLHttpRequest对象的生命周期各个阶段)的含义,就可以消除对Ajax核心的神秘感(语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,使人昭昭”),迅速把握其实质,对减少学习中的挫折感和增强自信心都极其有益。
//声明数组
var states = [“正在初始化……”,
“正在初始化请求……成功!
正在发送请求……”,
“成功!
正在接收数据……”,
“完成!
正在解析数据……”,
“完成!
”]; 
//回调函数内部代码片段
if (xmlHttp.readyState==4)
{
var span = document.createElement(“span”);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span); 
if (xmlHttp.status == 200)
{
var xmldoc = xmlHttp.responseXML;
//其他代码
} 
//别忘记销毁,防止内存泄漏
xmlHttp = null;
}else{
var span = document.createElement(“span”);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);
}结果如下:
正在初始化请求……成功!
正在发送请求……成功!
正在接收数据……完成!
正在解析数据……完成!
我们很容易明白XMLHttpRequest对象在各个阶段都在做什么。因此,也就很容易对Ajax的核心部分有一个真正简单明了的理解。
2、response.setHeader("P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");
但是跨域处理cookie浏览器会自动阻止此行为,不能写入cookie,也就不能读取.
网上提供的方法是在跨域请求时 设置 P3P HTTP Header 就可以完成跨域cookic的读写.
asp.net写请求的页面加入如下代码
Response.AddHeader("P3P", @"CP=""CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR""");
ajax 跨域请求jsonp的更多相关文章
- AJAX 跨域请求 - JSONP获取JSON数据
		Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的显示 ... 
- 【JS跨域请求】Ajax跨域请求JSONP
		前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白 ... 
- 【转】AJAX 跨域请求 - JSONP获取JSON数据
		来源:http://justcoding.iteye.com/blog/1366102/ Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流 ... 
- ajax跨域请求のJSONP
		简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级 ... 
- ajax跨域请求-jsonp
		1. 同源策略 ajax之所以需要“跨域”,罪魁祸首就是浏览器的同源策略.即,一个页面的ajax只能获取这个页面相同源或者相同域的数据. 如何叫“同源”或者“同域”呢?——协议.域名.端口号都必须相同 ... 
- ajax跨域请求--jsonp实例
		ajax请求代码: //区域事件选择配送点 function changeDistrict(value){ if(value == 0){ $('#transport_node').empty(); ... 
- jsonp其实很简单【ajax跨域请求】
		js便签笔记(13)——jsonp其实很简单[ajax跨域请求] 前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资 ... 
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
		1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ... 
- 利用jsonp进行Ajax跨域请求
		在进行Ajax请求的时候经常会遇到跨域的问题,这个时候一般就会用到jsonp. 关于json和jsonp,网上有很多原理解释,这里就不多赘述,需要的自行搜索. 下面是一个简单的ajax跨域请求示例: ... 
- JSONP实现Ajax跨域请求
		前言 由于浏览器存在同源策略的机制,所谓同源策略就是阻止从一个源(域名,包括同一个根域名下的不同二级域名)加载的文档或者脚本获取/或者设置另一个源加载的文档属性. 但比较特别的是:由于同源策略是浏览器 ... 
随机推荐
- 2020年12月-第01阶段-前端基础-HTML CSS 项目阶段(三)
			品优购项目(三) 1. 首页制作 1). 楼层区 floor 注意这个floor 一个大盒子 包含, 不要给高度,内容有多少,算多少 2). 家用电器模块 这个模块 简单 不需要写样式 版心居中对齐 ... 
- 输入法词库解析(七)微软用户自定义短语.dat
			详细代码:https://github.com/cxcn/dtool 前言 微软拼音和微软五笔通用的用户自定义短语 dat 格式. 解析 前 8 个字节标识文件格式 machxudp,微软五笔的 le ... 
- 01 uniapp/微信小程序 项目day01
			一.起步 1.1 配置uni-app开发环境 什么是uni-app,就是基于vue的一个开发框架,可以将我们写的一套代码,同时发布到ios.安卓.小程序等多个平台 官方推荐使用Hbuilderx来写u ... 
- 使用nginx-ingress-controller配置https,但是再同时配置使用http
			默认情况下,如果为该 Ingress 启用了 TLS,控制器会使用 308 永久重定向响应将 HTTP 客户端重定向到 HTTPS 端口 443.( Ingress 里配置了 https 证书的话,默 ... 
- PAT (Basic Level) Practice 1019 数字黑洞 分数 20
			给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有" ... 
- P2680 [NOIP2015 提高组] 运输计划 (树上差分-边差分)
			P2680 题目的大意就是走完m条路径所需要的最短时间(边权是时间), 其中我们可以把一条边的权值变成0(也就是题目所说的虫洞). 可以考虑二分答案x,找到一条边,使得所有大于x的路径都经过这条边(差 ... 
- Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用
			在<基于 vite 创建 vue3 项目>一文中整合了 pinia,有不少伙伴不知道 pinia 是什么,本文简单介绍 pinia.主要包括三方面: pinia 的基本用法,在<基于 ... 
- 【强烈推荐】用glob库的一行命令显著加速批量读取处理数据
			在我们气象领域,对数据进行批处理随处可见,尤其是在处理模式数据的时候.为了能让这个过程加速,很多大佬们提出了不同的方法,比如使用numba库进行计算.使用dask库进行并行等等,都是非常好的加速手段. ... 
- 2022-08-08-esp32把玩记-①
			layout: post cid: 4 title: esp32把玩记-① slug: 4 date: 2022/08/08 14:59:58 updated: 2022/08/08 14:59:58 ... 
- String简介
			String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的.实现了 ... 
