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 相关文章推荐
投票管理程序
Oct 09 PHP
MYSQL环境变量设置方法
Jan 15 PHP
php 静态变量的初始化
Nov 15 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
PHP 图片水印类代码
Aug 27 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
Sep 26 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
php实现读取内存顺序号
Mar 29 PHP
PHP Yaf框架的简单安装使用教程(推荐)
Jun 08 PHP
浅谈PHP链表数据结构(单链表)
Jun 08 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
深入理解Python中字典的键的使用
2015/08/19 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
python创建文件备份的脚本
2018/09/11 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
教育专业自荐书范文
2013/12/17 职场文书
入党自我评价优缺点
2014/01/25 职场文书
经典洗发水广告词
2014/03/13 职场文书
上海世博会口号
2014/06/19 职场文书
物流管理专业自荐信
2014/06/23 职场文书
中文专业自荐书
2014/06/29 职场文书
2019年大学推荐信
2019/06/24 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
Python标准库pathlib操作目录和文件
2021/11/20 Python
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技