如何解决ajax跨域问题

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


跨域问题

起 因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为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.mzph.cn/news/539586.shtml

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

相关文章

spring bean创建细节

1) 对象创建: 单例/多例 scope"singleton", 默认值,即默认是单例【service/dao/工具类】 scope"prototype", 多例;【Action对象】 2) 什么时候创建? scope"prototype" 在用到对象的时候&#xff0c…

发送邮件程序报错454 Authentication failed以及POP3和SMTP简介

一、发现问题 在测试邮件发送程序的时候,发送给自己的QQ邮箱,程序报错454 Authentication failed, please open smtp flag first。 二、解决问题 进入QQ邮箱——>设置——>账户——>POP3/IMAP/SMTP选择——>开启POP3/SMTP服务。 三、POP3和S…

MySQL数据库是非关系_MySQL(数据库)基础知识、关系型数据库yu非关系型数据库、连接认证...

什么是数据库?数据库(Database):存储数据的仓库高效地存储和处理数据的介质(介质主要是两种:磁盘和内存)数据库系统:DBS(Database System):是一种虚拟系统,将多种内容关联起来的称呼DBS DBMS DBDBMS&…

WPF 使用MahApps.Metro UI库

http://www.cnblogs.com/happyyftk/p/6904766.html 本文示例源码下载:MetroWPF 官方示例地址:http://mahapps.com/guides/quick-start.html 官方控件示例地址:http://mahapps.com/controls/ MahApps.Metro 项目源码:https://githu…

SpringIOC容器-创建对象

SpringIOC容器,是spring核心内容。功能:创建对象,处理对象的依赖关系 IOC容器创建对象: 创建对象, 有几种方式: 1) 调用无参数构造器 2) 带参数构造器 3) 工厂创建对象 工厂类&…

java注释搞笑图案_搞笑的代码注释,那些有趣的程序员

发表于 2019-04-24 16:11:26 by 月小升搞笑/**** .::::.* .::::::::.* ::::::::::: F*CK YOU* ..:::::::::::* ::::::::::::* .::::::::::* ::::::::::::::..* ..::::::::::::.* ::::::::::::::::* ::::::::::::: .:::.* :::: ::::: .::::::::.* .:::: :::: .:::::::::::.* .::…

SpringIOC容器-对象依赖

1 概述 Spring中&#xff0c;如何给对象的属性赋值? 【DI, 依赖注入】 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4) 自动装配 5) 注解 1.1 通过构造函数 <!-- ###############对象属性赋值############### --><!-- 1) 通过构造函数 --><be…

f5长连接策略

但是把这些短连接汇聚到一起&#xff0c;集中F5的设备上&#xff0c;通过F5与服务器建立平滑的长连接&#xff0c;就解决了不断增大的并发连接。比如说前台有15万个并发连接&#xff0c;经过F5的优化&#xff0c;在服务器上只有不到5000个并发连接&#xff0c;而且在此过程中&a…

pdo-mysql_PHP: MySQL (PDO) - Manual

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(int)Если этот атрибут установлен в true вPDOStatement, MySQL-драйвербудет использовать буферизованные версии API MySQL.Если вы пишете пе…

Spring IOC容器【p名称空间注入属性值 】

# p 名称空间给对象的属性注入值(spring3.0以上版本才支持) 需要引入&#xff1a; xmlns:p"http://www.springframework.org/schema/p" 举例 applicationContext.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http…

Spring properties定义bean

2019独角兽企业重金招聘Python工程师标准>>> Spring提供了丰富的标签和注解来进行bean的定义&#xff0c;除此之外框架来提供了扩展机制让使用可以通过properties来定义bean&#xff0c;与强大的标签式和注解式的bean定义相比&#xff0c;properties提供的规则要简单…

Spring IOC容器-自动装配

1 autowire"byName" 根据名称自动装配&#xff0c;自动去IOC容器中找与属性名同名的引用的对象&#xff0c;并自动注入。 <!-- ###############自动装配############### --> <bean id"userDao" class"d_auto.UserDao"></bean&g…

linux下C++遍历文件夹下的全部文件;Windows/Linux下C++批量修改文件名,批量删除文件...

Linux下 C遍历目录下所有文件 1 rename(image_path.c_str(), image_path_new.c_str()); 2 remove(image_path_move.c_str()); 上述批量操作的代码是在linux下的参数设置&#xff1a; rename的参数&#xff0c;image_path为原文件的路径文件名&#xff0c;image_path_new为文件…

mongodb java 单例_Java单例MongoDB工具类

我经常对MongoDB进行一些基础操作&#xff0c;将这些常用操作合并到一个工具类中&#xff0c;方便自己开发使用。没用Spring Data、Morphia等框架是为了减少学习、维护成本&#xff0c;另外自己直接JDBC方式的话可以更灵活&#xff0c;为自己以后的积累留一个脚印。Java驱动版本…

Spring IOC容器-注解的方式

注解方式可以简化spring的IOC容器的配置&#xff0c;但不利于后期维护&#xff0c;对象之间的依赖关系不能像xml文件一样方便查阅&#xff0c;一目了然。 注解可以和XML配置一起使用。 使用注解步骤&#xff1a; 1&#xff09;先引入context名称空间 xmlns:context"htt…

前端请求进化之路--从form表单到JSONP

简单梳理前端请求的变迁史&#xff0c;着重对JSONP进行整理 请求演变 使用form表单提交请求&#xff0c;缺点是每次提交必定会刷新页面在1基础之上使用iframe进行局部刷新&#xff0c;用户体验得到一定优化动态创建图片提交请求 注意请求与返回内容类型须一致每次必须返回图片较…

Spring IOC容器-注解的方式【更简化】

----更加简化的版本 UserAction.java import javax.annotation.Resource;import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller;//Component("userAction") // 加入IOC容器//ComponentController // 控制层的组件…

hive安装mysql驱动_Hadoop-2.6.0为基础的Hive安装

Hive安装软件需求与环境说明假设已经搭建好 Hadoop-2.6.0 环境&#xff0c;并能正常运行mysql 安装软件服务端&#xff1a;MySQL-server-5.5.16-1.rhel5.x86_64.rpm客户端&#xff1a;MySQL-client-5.5.16-1.rhel5.x86_64.rpmhive安装软件&#xff1a;apache-hive-1.2.1-bin.ta…

视频通信原理——NAT介绍

一&#xff1a;为什么需要NAT由于IP地址随着互联网的发展而逐渐稀缺&#xff0c;难以使得每台主机都拥有一个公网上的IP地址&#xff0c;且并不是所有主机都需要一个公网上的地址&#xff0c;于是就有了NAT技术。NAT&#xff08;The IP Network Address Translator&#xff09;…

Oracle中执行存储过程call和exec区别

在sqlplus中这两种方法都可以使用&#xff1a; exec pro_name(参数1..); call pro_name(参数1..); 区别&#xff1a; 1. 但是exec是sqlplus命令&#xff0c;只能在sqlplus中使用&#xff1b;call为SQL命令&#xff0c;没有限制. 2. 存储过程没有参数时,exec可以直接跟过…