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 相关文章推荐
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
php中autoload的用法总结
Nov 08 PHP
PHP+jQuery 注册模块开发详解
Oct 14 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
PHP中判断文件存在使用is_file还是file_exists?
Apr 03 PHP
PHP实现的json类实例
Jul 28 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
php网页版聊天软件实现代码
Aug 12 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
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
python从入门到精通(DAY 2)
2015/12/20 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python主要用于哪些方向
2020/07/05 Python
python如何实现图片压缩
2020/09/11 Python
如何用python 操作zookeeper
2020/12/28 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
计算机专业个人简短的自我评价
2013/10/23 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
党员大会主持词
2014/04/02 职场文书
租车协议书范本
2014/04/22 职场文书
政府法律服务方案
2014/06/14 职场文书
班级心理活动总结
2014/07/04 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书