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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
我的论坛源代码(五)
Oct 09 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
php三种实现多线程类似的方法
Oct 30 PHP
分享五个PHP7性能优化提升技巧
Dec 07 PHP
PHP常用技巧汇总
Mar 04 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
PHP strip_tags保留多个HTML标签的方法
May 22 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 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
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
js表头排序实现方法
2015/01/16 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
js实现简易计算器功能
2019/10/18 Javascript
pandas string转dataframe的方法
2018/04/11 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
房地产销售大学生自我评价分享
2013/11/11 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
环保建议书200字
2014/05/14 职场文书
拾金不昧感谢信
2015/01/21 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
大学生入党群众意见书
2015/06/02 职场文书
十八大观后感
2015/06/12 职场文书
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫