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 allow_url_include的应用和解释
Apr 22 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
领悟php接口中interface存在的意义
Jun 27 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php生成年月日下载列表的方法
Apr 24 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
PHP学习笔记之session
May 06 PHP
php实现等比例压缩图片
Jul 26 PHP
yii2 在控制器中验证请求参数的使用方法
Jun 19 PHP
Laravel 读取 config 下的数据方法
Oct 13 PHP
PHP程序守护进程化实现方法详解
Jul 16 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 addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
Javascript下的keyCode键码值表
2007/04/10 Javascript
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
javascript几个易错点记录
2014/11/26 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
浅谈python jieba分词模块的基本用法
2017/11/09 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
详解python中*号的用法
2019/10/21 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
国际商贸专业自荐信
2014/06/09 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
客户答谢会致辞
2015/01/20 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
幸福来敲门观后感
2015/06/04 职场文书
反腐倡廉观后感
2015/06/08 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers