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 UTF8 文件的签名问题
Oct 30 PHP
新手学习PHP的一些基础知识分享
Jul 27 PHP
php 邮件发送问题解决
Mar 22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
php实现的常见排序算法汇总
Sep 08 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
浅谈PHP Cookie处理函数
Jun 10 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
Sep 11 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
js闭包用法实例详解
2016/12/13 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
简单了解python变量的作用域
2019/07/30 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
PHP如何自定义函数
2016/09/16 面试题
综合实践活动方案
2014/02/14 职场文书
餐厅经理岗位职责范本
2014/02/17 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
导游词之山东孔庙
2019/11/04 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python