AJAX的跨域访问-两种有效的解决方法介绍


Posted in PHP onJune 22, 2013

新的W3C策略实现了HTTP跨域访问,还亏我找了很久的资料解决这个问题:
只需要在servlet中返回的头部信息中添加Access-Control-Allow-Origin这个既可。
比如我要开放所有我本地的跨域访问,就设置如下:response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1/*");
这样我本地的A工程中的AJAX请求就可以跨域请求B工程中的servlet。
代码如下:
HTML的JS的ajax请求:

/* Create a new XMLHttpRequest object to talk to the Web server */
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
    try {
  xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e2) {
  xmlHttp = false;
    }
}
@end @*/
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
     xmlHttp = new XMLHttpRequest();
}
var url = "http://127.0.0.1:2012/esb/servlet/HttpClient?randomType=MIX";
xmlHttp.open("GET", url, true);
//Setup a function for the server to run when it's done
xmlHttp.onreadystatechange = function(){
    if (xmlHttp.readyState == 4) {
  var response = xmlHttp.responseText;
  alert(response);
}
}
//Send the request
xmlHttp.send(null);

servlet代码:
protected void service(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, java.io.IOException {
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
//下面那句是核心
resp.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1/*");
resp.setDateHeader("Expires", 0);
ServletOutputStream sos = resp.getOutputStream();
try {
     sos.write(obj.toString().getBytes("GBK"));
 } catch (Exception e) {
     System.out.println(e.toString90)
 } finally {
  try {
sos.close();
  } catch (Exception e) {
LOG.error(e);
  }
 }
}

代码在本机测试是可以的,待过两天,我把servlet放到服务器上去,然后再本地测试。
上面的方式虽然很完美的解决了问题,但是上面的文章也说了。可能存在安全问题,而且新标准是否都支持还是个问题,所以我们可以套用另外一种取巧的方式来完成同样的效果,因为js不存在跨域问题,如果我们服务器的servlet返回的是JS脚本,那就可以了。我们可以在A工程的js中使用javascript的src来访问B工程的servlet,然后通过servlet输出的js脚本来传递数据。因此根据这个思想我又做了下面代码的测试:
页面的JS代码:
function loadAjax(){
     id="testesbscript";
     oScript = document.getElementById(id);
     var head = document.getElementsByTagName("head").item(0);
     if (oScript) {
  head.removeChild(oScript);
    }
    oScript = document.createElement("script");
    var url = "http://127.0.0.1:2012/esb/servlet/HttpClient?randomType=MIX&success=justHandle
    oScript.setAttribute("id",id);
    oScript.setAttribute("type","text/javascript");
    oScript.setAttribute("language","javascript");
    head.appendChild(oScript);
}
//jsutHandle这个函数是反调函数。servlet代码中会使用eval这种方式来执行。
function justHandle(dd){
    alert(dd);
}

servlet的代码:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {Object obj = "test";
ServletOutputStream sos = resp.getOutputStream();
StringBuffer sb = new StringBuffer();
resp.setCharacterEncoding("GBK");
resp.setHeader("Charset","GBK");
resp.setContentType("charset=GBK");
//下面那句表明是javascript脚本文件
resp.setContentType("text/javascript"); 
sb.append("eval(/""+paramMap.get("success")+"(/'"+obj.toString()+"/')/")");
try {
    sos.write(sb.toString().getBytes(this.character_encoding));
} catch (Exception e) {
    System.out.println(e.toString());
} finally {
     try {
   sos.close();
} catch (Exception e) {
   System.out.println(e.toString());
}
}
}

PHP 相关文章推荐
让PHP更快的提供文件下载的代码
Jun 13 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 #PHP
PHP中mb_convert_encoding与iconv函数的深入解析
Jun 21 #PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 #PHP
浅析PHP页面局部刷新功能的实现小结
Jun 21 #PHP
解析php中var_dump,var_export,print_r三个函数的区别
Jun 21 #PHP
基于PHP文件操作的详细诠释
Jun 21 #PHP
解析php安全性问题中的:Null 字符问题
Jun 21 #PHP
You might like
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
简单学习vue指令directive
2016/11/03 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
python实现图片识别汽车功能
2018/11/30 Python
人工神经网络算法知识点总结
2019/06/11 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL