如何解决ajax跨域问题(转)

 

由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题。本篇将讲述一个小白从遇到跨域不知道是跨域问题,到知道是跨域问题不知道如何解决,再到解决跨域问题,最后找到两种方法解决ajax 跨域问题的全过程。

不知是跨域问题

起 因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统;调用A系统以B为例。在B系统 中用ajax调用A系统系统的接口(数据格式为json),当时特别困惑,在A系统中访问相应的url可正常回返json数据,但是在B系统中使用 ajax请求同样的url则一点儿反应都没有,好像什么都没有发生一样。这样反反复复改来改去好久都没能解决,于是求救同事,提醒可能是ajax跨域问 题,于是就将这个问题当做跨域问题来解决了。

知跨域而不知如何解决

知道问题的确切原因,剩下的就是找到解决问题的方法了。google了好久,再次在同事的指点下知道jQuery的ajax有jsonp这样的属性可以用来解决跨域的问题。

找到一种解决方式

现在也知道了怎样来解决跨域问题,余下的就是实现的细节了。实现的过程中错误还是避免不了的。由于不了解json和jsonp两种格式的区别,也犯了错误,google了好久才解决。

首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:

复制代码
$(document).ready(function(){var url='http://localhost:8080/WorkGroupManagment/open/getGroupById"+"?id=1&callback=?';$.ajax({url:url,dataType:'jsonp',processData: false, type:'get',success:function(data){alert(data.name);},error:function(XMLHttpRequest, textStatus, errorThrown) {alert(XMLHttpRequest.status);alert(XMLHttpRequest.readyState);alert(textStatus);}});});
复制代码

这样写是完全没有问题的,起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变 为上面的实现方式。最后一行alert使用为;parsererror。百思不得其解,继续google,最终还是在万能的stackoverflow找 到了答案,链接在这里。原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同。

比较一下json与jsonp格式的区别:

json格式:
{"message":"获取成功","state":"1","result":{"name":"工作组1","id":1,"description":"11"}
}
jsonp格式:
callback({"message":"获取成功","state":"1","result":{"name":"工作组1","id":1,"description":"11"}
})

看出来区别了吧,在url中callback传到后台的参数是神马callback就是神马,jsonp比json外面有多了一层,callback()。这样就知道怎么处理它了。于是修改后台代码。

后台java代码最终如下:

复制代码
@RequestMapping(value = "/getGroupById")public String getGroupById(@RequestParam("id") Long id,HttpServletRequest request, HttpServletResponse response)throws IOException {String callback = request.getParameter("callback");ReturnObject result = null;Group group = null;try {group = groupService.getGroupById(id);result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS);} catch (BusinessException e) {e.printStackTrace();result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED);}String json = JsonConverter.bean2Json(result);response.setContentType("text/html");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();out.print(callback + "(" + json + ")");return null;}
复制代码

注意这里需要先将查询结果转换我json格式,然后用参数callback在json外面再套一层,就变成了jsonp。指定数据类型为jsonp的ajax就可以做进一步处理了。

虽然这样解决了跨域问题,还是回顾下造成parsererror的原因。原因在于盲目的把json格式的数据当做jsonp格式的数据让ajax处理,造成了这个错误,此时server端代码是这样的:

复制代码
@RequestMapping(value = "/getGroupById")@ResponseBodypublic ReturnObject getGroupById(@RequestParam("id") Long id,HttpServletRequest request, HttpServletResponse response){String callback = request.getParameter("callback");ReturnObject result = null;Group group = null;try {group = groupService.getGroupById(id);result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS);} catch (BusinessException e) {e.printStackTrace();result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED);}return result;}
复制代码

至此解决ajax跨域问题的第一种方式就告一段落。

追加一种解决方式

追求永无止境,在google的过程中,无意中发现了一个专门用来解决跨域问题的jQuery插件-jquery-jsonp。

有第一种方式的基础,使用jsonp插件也就比较简单了,server端代码无需任何改动。

来看一下如何使用jquery-jsonp插件解决跨域问题吧。

复制代码
var url="http://localhost:8080/WorkGroupManagment/open/getGroupById"+"?id=1&callback=?";
$.jsonp({"url": url,"success": function(data) {$("#current-group").text("当前工作组:"+data.result.name);},"error": function(d,msg) {alert("Could not find user "+msg);}
});
复制代码

 

至此两种解决跨域问题的方式就全部介绍完毕。

原文地址:http://www.congmo.net/blog/2012/06/27/ajax-cross-domain/

 

转载于:https://www.cnblogs.com/weiwang/p/6952689.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断输入的字符串是否为回文_刷题之路(九)--判断数字是否回文

Palindrome Number问题简介:判断输入数字是否是回文,不是返回0,负数返回0举例:1:输入: 121输出: true2:输入: -121输出: false解释: 回文为121-,所以负数都不符合3:输入: 10输出: false解释: 倒序为01,不符合要求解法一:这道题比较…

VirtualBox 虚拟机复制

本文简单讲两种情况下的复制方式 1 跨电脑复制 2 同一virtrul box下 虚拟机复制 ---------------------------------------------- 1 跨电脑复制 a虚拟机 是老的虚拟机 b虚拟机 是新的虚拟机 新虚拟机b 新建, 点击下一步会生成 相应的文件夹 找到老虚拟机a的 vdi 文…

mysql case快捷方法_MySQL case when使用方法实例解析

首先我们创建数据库表: CREATE TABLE t_demo (id int(32) NOT NULL,name varchar(255) DEFAULT NULL,age int(2) DEFAULT NULL,num int(3) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8;插入数据:INSERT INTO t_demo VALUES (1, 张…

Java快速扫盲指南

文章转自:https://segmentfault.com/a/1190000004817465#articleHeader22 JDK,JRE和 JVM 的区别 JVM:java 虚拟机,负责将编译产生的字节码转换为特定机器代码,实现一次编译多处执行; JRE:java运…

mongo基本使用方法

mongo与关系型数据库的概念对比,区分大小写,_id为主键。 1.数据库操作 >show dbs #查看所有数据库 >use dbname #创建和切换数据库(如果dbname存在则切换到该数据库,不存在则创建并切换到该数据库;新创建的…

python爬虫消费者与生产者_Condition版生产者与消费者模式

概述:在人工智能来临的今天,数据显得格外重要。在互联网的浩瀚大海洋中,隐藏着无穷的数据和信息。因此学习网络爬虫是在今天立足的一项必备技能。本路线专门针对想要从事Python网络爬虫的同学而准备的,并且是严格按照企业的标准定…

【Python包】安装teradatasql提示找不到pycryptodome模块错误(pycrypto,pycryptodome和crypto加密库)...

1.问题描述 安装teradatasql时,出现错误Could not find a version that satisfies the requirement pycryptodome,具体如下: 2.解决方法 查看Python第三方库目录$PYTHON_HOME/lib/python3.6/site-packages目录下没有pycryptodome目录&#xf…

简述yolo1-yolo3_使用YOLO框架进行对象检测的综合指南-第二部分

简述yolo1-yolo3In the last part, we understood what YOLO is and how it works. In this section, let us understand how to apply it using pre-trained weights and obtaining the results. This article is greatly inspired by Andrew Ng’s Deep Learning Specializat…

java cxf 调用wcf接口_JAVA 调用 WCF 服务流程

1. 将 WCF 服务发布到 Windows 服务(或者 IIS)此步骤的目的是为 WCF 服务搭建服务器,从而使服务相关的 Web Services 可以被 JAVA 客户端程序调用,具体步骤参考如下:(1) 发布到 Windows 服务(2) 发布到 IIS注:如果是将 WCF 服务…

gcp devops_将GCP AI平台笔记本用作可重现的数据科学环境

gcp devopsBy: Edward Krueger and Douglas Franklin.作者: 爱德华克鲁格 ( Edward Krueger)和道格拉斯富兰克林 ( Douglas Franklin) 。 In this article, we will cover how to set up a cloud computing instance to run Python with or without Jupyter Notebo…

迅为工业级iMX6Q开发板全新升级兼容PLUS版本|四核商业级|工业级|双核商业级...

软硬件全面升级 1. 新增Yocto项目的支持 增加opencv等软件功能 2. 新近推出i.MX6增强版本核心板(PLUS) -性能更强 四种核心板全兼容 四核商业级2G/16G;双核商业级1G/8G ;四核工业级1G/8G ;四核增强版(PLUS) 3. 豪华配…

电力现货市场现货需求_现货与情绪:现货铜市场中的自然语言处理与情绪评分

电力现货市场现货需求Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works with…

java做主成分分析_主成分分析PCA

PCA(Principal Component Analysis),即主成分分析,一种常用于数据降维分析的方法。要理解PCA的原理,首先需要理解矩阵变换的意义。矩阵变换,有两种意义:1,在当前坐标系下的向量,经过矩阵M变换后…

个人学习进度(第十六周)

转载于:https://www.cnblogs.com/lhj1017/p/7011993.html

用python绘制箱线图_用卫星图像绘制世界海岸线图-第一部分

用python绘制箱线图At the UKHO, we use data science to gain valuable insight into the data sets we hold and further our understanding of the marine environment around us.在UKHO,我们使用数据科学获得对所拥有数据集的宝贵见解,并进一步了解周…

在ASP.NET Atlas中调用Web Service——创建Mashup调用远端Web Service(基础知识以及简单示例)...

作者:Dflying Chen (http://dflying.cnblogs.com/) 注:Atlas中的Mashup极其复杂,其中涉及众多的对象与架构,为了写这篇文章,我花了不少时间学习研究。同时,关于这方面资源的匮乏简直…

java弹框形式输入_java中点击一个按钮弹出两个输入文本框的源代码

展开全部写了一个很简单的案例,可以参考和修改import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import…

7时过2小时是几时_2017最北师大版二年级下册数学第七单元《时、分、秒》过关检测卷...

二年级数学下册时分秒测试卷一、填一填。(每空1分,共36分)1.钟面上有()大格,()个小格,时针走1个大格是()时,分针走一个大格是()分。2.1分()秒()分1时1分15秒()秒3.1小时20分()分90分()小时()分 70秒()分()秒4.用时、分、秒填空a)我…

java 加载class文件路径_动手实现MVC: 1. Java 扫描并加载包路径下class文件

背景用过spring框架之后,有个指定扫描包路径,然后自动实例化一些bean,这个过程还是比较有意思的,抽象一下,即下面三个点如何扫描包路径下所有的class文件如何扫描jar包中对应包路径下所有的class文件如何加载class文件…

java jolt tuxedo_java通过jolt调用tuxedo服务.xls

java通过jolt调用tuxedo服务.xls还剩20页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:?private bea.jolt.pool.servlet.ServletSessionPoolManager bool…