ajax跨域访问http服务--jsonp
在前面一篇文章《Spring Cloud 前后端分离后引起的跨域访问解决方案》里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加CorsFilter过滤器,然后ajax调用时设置xhrFields{withCredentials: true}来传递cookie信息。
本文采用jsonp方式处理。
背景
应用A 的地址为http:127.0.0.1:8081
应用B的地址为http:127.0.0.1:8082
应用B提供一个后台http服务/hello来返回session等相关信息
A的前台ajax跨域访问B的此http服务
应用A前台ajax代码:
$.ajax({
type: "POST",
async: "true",
url: "http://127.0.0.1:8082/hello",
dataType: "jsonp",
jsonp:"jsonpCallback",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + "," + errorThrown);
},
beforeSend: function (XMLHttpRequest) {
},
/* 使用jsonp时无需添加此属性。cookie会默认传递到后端
xhrFields: {
withCredentials: true
},*/
success: function (data, status) {
alert("数据:" + data + "\n状态:" + status);
}
});
其中
1.dataType=jsonp,表示用于跨域请求。
2.jsonp属性的值可自行定义,这个值在后台会用到。jsonp属性用于指定获得jsonp回调函数名的参数名(默认为:callback)。这个值用来替代URL中"callback=?"里的"callback"部分,比如代码中设置了jsonp=jsonpCallback,则会将"jsonpCallback=?"传给服务器。
应用B后台代码
@RequestMapping("/hello")
//@CrossOrigin 使用jsonp则无需此注解
Object hello() {
String result = "hello,i'm spring boot,server.port=" + port + ";sessionId=" + RequestUtil.getSessionId( );
log.info("hello,result={}", result);
//打印cookie信息,以确认cookie是否传递过来
Cookie[] cookies = RequestUtil.getRequest( ).getCookies( );
if (cookies != null && cookies.length > 0) {
for (Cookie cookie :
cookies) {
log.info("cookie,key={},value={}", cookie.getName( ), cookie.getValue( ));
}
}
//判断是否是jsonp请求(此处的jsonpCallback与ajax中jsonp的值对应),如果是jsonp的,则需要返回jsonp(result)
String jsonpCallback = RequestUtil.getRequest( ).getParameter("jsonpCallback");
if (StringUtils.isEmpty(jsonpCallback))
return result;
else
return new JSONPObject(jsonpCallback, result);//最终的效果是jsonpCallback(result)
}
注意:jsonp调用时返回JSONPObject对象,真正从后台返回的字符串格式如下:
jQuery111108124416126231964_1534906372378("hello,i'm spring boot,server.port=8082;sessionId=B2411EAD05B3FD792F7C80756E72B2E1")
0
其中jQuery111108124416126231964_1534906372378即前台ajax传递的jsonpCallback参数的值。。
验证
多次访问,session不变。。

抓包:

后台日志:可见session没变。。cookie也传递过去了

总结
对于jsonp方式的ajax跨域访问,无需增加xhrFields参数,会默认传递cookie,后台返回jsonpObject,后台无需增加跨域注解或者跨域过滤器
对于非jsonp的普通ajax调用,需要增加xhrFields参数标示需要传递cookie,后台需增加跨域注解或者跨域过滤器
ajax跨域访问http服务--jsonp的更多相关文章
- Ajax跨域访问wcf服务中所遇到的问题总结。
工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...
- 浅析JSONP-解决Ajax跨域访问问题
浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...
- Ajax跨域访问解决办法
方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...
- 什么是跨域访问,JSON&JSONP
http://blog.csdn.net/notechsolution/article/details/50394391 更详细的讲解,关于同源策略等: http://www.cnblogs.com/ ...
- Web Api 2(Cors)Ajax跨域访问
支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...
- ajax 跨域访问的解决方案
ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...
- Hbuilder编辑App时,ajax跨域访问失败问题
今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...
- 关于JQuery Ajax 跨域 访问.net WebService
关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...
- JS Ajax跨域访问
js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...
随机推荐
- 【题解】「CF1182B」Plus from Picture
这是一道超级水的模拟 + 简单搜索. 说说思路: 先找到中心点,就是自己和上下左右都为 * 的. 上下左右上的所有 * 都删掉,然后再看看有没有多余的 * 如果有输出 NO 否则输出 YES. 比如说 ...
- 推荐系统实践 0x0f AutoRec
从这一篇开始,我们开始学习深度学习推荐模型,与传统的机器学习相比,深度学习模型的表达能力更强,并且更能够挖掘出数据中潜藏的模式.另外.深度学习模型结构也非常灵活,能够根据业务场景和数据结构进行调整.还 ...
- centos7 安装netstat命令工具
[root@node01 yum.repos.d]# yum install -y net-tools Loaded plugins: fastestmirror Loading mirror spe ...
- Navicat Primium连接数据库报ORA-28547错误
这个问题主要是Navicat Primium与orecal中的oci.dll版本不一致造成的,无论是本地数据库或者网络数据库. 解决方法:在数据库orecal安装目录中搜索oci.dll文件,找到后将 ...
- 02-Dockerfile的基本使用
1. FROM 作用:指定基础镜像 使用:FROM 镜像名 demo: FROM mysql FROM mysql:5.6 2. RUN 作用:指令是用来执行命令行命令的 使用: shell格式:RU ...
- css进阶 03-网页设计和开发中,关于字体的常识
03-网页设计和开发中,关于字体的常识 #前言 我周围的码农当中,有很多是技术大神,却常常被字体这种简单的东西所困扰. 这篇文章,我们来讲一讲关于字体的常识.这些常识所涉及到的问题,有很强的可操作性, ...
- [日常摸鱼]loj6000「网络流 24 题」搭配飞行员
题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. ...
- 5分钟看懂系列:Python 线程池原理及实现
概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...
- js深克隆与浅克隆
定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...
- Java基础进阶:学生管理系统数组方式分包源码实现,教师管理系统集合和数组两种方式源码实现,图书馆管理系统源码实现,现附重难点,代码实现源码,课堂笔记,课后扩展及答案
1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码 ...