在前面一篇文章《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的更多相关文章

  1. Ajax跨域访问wcf服务中所遇到的问题总结。

    工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...

  2. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  3. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

  4. 什么是跨域访问,JSON&JSONP

    http://blog.csdn.net/notechsolution/article/details/50394391 更详细的讲解,关于同源策略等: http://www.cnblogs.com/ ...

  5. Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示   随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...

  6. ajax 跨域访问的解决方案

    ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...

  7. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  8. 关于JQuery Ajax 跨域 访问.net WebService

    关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...

  9. JS Ajax跨域访问

    js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...

随机推荐

  1. ubuntu18.04 登录界面循环,已解决

    按照百度的方法,要卸载重装nvidia,遇到如下问题 1.进入Ubuntu字符界面,出现乱码,猜测是sudo命令出现问题,果然 解决方案:$ PATH=/usr/kerberos/sbin:/usr/ ...

  2. win 7 MongoDB 下载安装

    准备: 1.mongodb-win32-x86_64-2008plus-ssl-3.4.3-signed.msi 官方下载 2.1.建立数据存放目录 F:\MongoDB\ 2.建立日志文件      ...

  3. Jmeter(2)基础知识

    一.Jmeter测试计划 1.测试计划用来描述一个性能/接口测试的脚本和场景设计 独立运行每个线程组:用于控制测试计划中的多个线程组的执行顺序.不勾选时,默认各线程组并行.随机执行. 主线程结束后运行 ...

  4. 【UV统计】海量数据统计的前世今生

    转载请注明出处 背景 在互联网公司中,每个项目都需要数据统计.分析,便于项目组利用详细数据研究项目的整体情况,进行下一步的调整.在数据统计中,UV统计是最常见的,也是最普遍的.有的场景要求实时性很高, ...

  5. 字节跳动内部微服务架构-Docker实战学习笔记分享 真香

    前言 基于 Spring Cloud 的微服务设计和开发,已经越来越多地得到了更多企业的推广和应用,而 Spring Cloud 社区也在不断的迅速发展壮大之中,近几年时间,Spring Cloud ...

  6. springmvc中使用文件下载功能

    项目代码:https://github.com/PeiranZhang/springmvc-fileupload 使用文件下载步骤 对请求处理方法使用void或null作为返回类型,并在方法中添加Ht ...

  7. IIS应用程序池配置详解及优化

    参数说明 1.常规 属性名称 属性详解 NET CLR 版本 配置应用程序池,以加载特定版本的 .NET CLR.选定的 CLR版本应与应用程序所使用的相应版本的 .NET Framework 对应. ...

  8. 【PY从0到1】第二节 字符串和数字

    #本课程都以代码形式呈现.现在进入Python的基础内容的学习. #由于本课程是从0开始分享,所以Python的基础内容是必不可少的.这也是Python量化的必经之路. #下面进入正题. #一般用'# ...

  9. 浅谈 FHQ-Treap

    关于FHQ-Treap             --作者:BiuBiu_Miku 可能需要的前置知识:    一.树形结构的了解:        树形,顾名思义,就是像树一样有很多分叉口,而这里以二叉 ...

  10. Python稳基修炼之异常处理

    错误与异常 1.区分错误与异常 两种错误(都必须改正): 语法错误(代码不规范,格式不对或缺少符号).逻辑错误(逻辑不通) 异常: 程序运行时发生错误的信号 2.异常处理与注意事项 异常处理: 程序员 ...