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 insert语法详解
Jun 07 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
Oct 30 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
php数组查找函数总结
Nov 18 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 PHP
Laravel实现短信注册的示例代码
May 29 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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的命名空间(二)
2018/02/21 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
js select option对象小结
2013/12/20 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
python 数据的清理行为实例详解
2017/07/12 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
python之列表推导式的用法
2019/11/29 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
Python创建自己的加密货币的示例
2021/03/01 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
产假请假条
2014/04/10 职场文书
档案保密承诺书
2014/06/03 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
庆国庆活动总结
2014/08/28 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python