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 Ajax实现页面无刷新发表评论
Jan 02 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
由php的call_user_func传reference引发的思考
Jul 23 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
Apr 01 PHP
php实现文件下载功能的几个代码分享
May 10 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
ThinkPHP中redirect用法分析
Dec 05 PHP
php简单计算页面加载时间的方法
Jun 19 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
针对PHP开发安全问题的相关总结
Mar 22 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
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
详解python的ORM中Pony用法
2018/02/09 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
python中bytes和str类型的区别
2019/10/21 Python
Pygame框架实现飞机大战
2020/08/07 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
医院护士的求职信
2014/01/03 职场文书
满月酒答谢词
2014/01/14 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
森林病虫害防治方案
2014/06/02 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
端午节活动总结报告
2015/02/11 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis