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实现的MySQL通用查询程序
Mar 11 PHP
PHP 翻页 实例代码
Aug 07 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
php实现快速排序法函数代码
Aug 27 PHP
PHP中HTML标签过滤技巧
Jan 07 PHP
php中Snoopy类用法实例
Jun 19 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
Jun 29 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
理解 JavaScript EventEmitter
2018/03/29 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
使用Python & Flask 实现RESTful Web API的实例
2017/09/19 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
python实现从ftp服务器下载文件
2020/03/03 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
会计电算化应届生求职信
2013/11/03 职场文书
办公室主任岗位职责
2015/01/31 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python