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 相关文章推荐
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
PHP设计模式之结构模式的深入解析
Jun 13 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
php生成短域名函数
Mar 23 PHP
PHP中new static()与new self()的比较
Aug 19 PHP
php获取当前月与上个月月初及月末时间戳的方法
Dec 05 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 PHP
PHP与以太坊交互详解
Aug 24 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 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
JAVA/JSP学习系列之七
2006/10/09 PHP
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
php session 预定义数组
2009/03/16 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
JSONP之我见
2015/03/24 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
浅谈五大Python Web框架
2017/03/20 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
中介业务员岗位职责
2014/04/09 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers