AJAX的跨域访问-两种有效的解决方法介绍

新的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());
}
}
}

(0)

相关推荐

  • asp.net(C#)跨域及跨域写Cookie问题

    解决方法是: 复制代码 代码如下: //www.B.com里的被调用的页面需要写P3P头,从而解除IE对写Cookie的阻止 context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); //www.A.com里通过ajax调用www.B.com里的内容时,是跨域访问,需要使用jsonp,为配合其工作需要添加下面两句,生成jsonp返回 context.Response.ContentType = "text/p

  • asp.net关于Cookie跨域(域名)的问题

    跨二级域名 我们知道cookie是可以跨二级域名来访问,这个很好理解,例如你 www.test1.com 在的web应用程序创建了一个cookie,要想在bbs.test1.com这样的二级域名对应的应用程序中访问,就必须你在创建cookie的时候设置domain参数domain=test1.com. 以asp.net为例 代码如下: 复制代码 代码如下: HttpCookie cookie = new HttpCookie("name", "www.Admin10000.c

  • AJAX javascript的跨域访问执行

    突然感觉就是这里的问题,研究一下,搞定后其实觉得挺容易的,只是自己知识还是有些欠缺,解决方法如下: 阻塞的AJAX请求 我们先来证实一下请求的阻塞情况吧.我们使用如下的代码: 连续发起三个请求  复制代码 代码如下: function simpleRequest()  {     var request = new XMLHttpRequest();      request.open("POST", "Script.ashx");      request.sen

  • ASP.NET XmlHttp跨域访问实现代码

    原来由于浏览器的安全限制,网络连接的跨域访问时不被允许的.我们不能在浏览器端直接使用AJAX来跨域访问资源,但是在服务器端是没有这种跨域安全限制的.所以,我们只需要让服务器端帮我们完成"跨域访问"的工作,然后直接获取服务器端"跨域访问"的结果就可以了.分享下我的解决办法,希望能有所帮助.^_^ CertCheck.aspx:  复制代码 代码如下: using MSXML2; namespace CA2 { public partial class CertChec

  • 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的示例教程

    随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,正常情况下Web Api是不允许这样做的,这涉及到安全问题.所以,今天我们这篇文章的主

  • asp.net中WebResponse 跨域访问实例代码

    前两天,一个朋友让我帮他写这样一个程序:在asp.net里面访问asp的页面,把数据提交对方的数据库后,根据返回的值(返回值为:OK或ERROR),如果为OK再把填入本地数据库.当时,想当然,觉得很简单,用js的xmlhttp ,如果根据response 的值是"OK"就执行提交本地数据库.很快写完发过去,让朋友试试,一试发现不行,后来一问,原来是跨域访问,我给忽略了,于是让朋友把asp改成web service,可朋友说程序是合作公司做的,只会asp,不会用web service ,

  • 解决AJAX中跨域访问出现'没有权限'的错误

    禁止访问非同域的网站,下面一个例子来访问http://www.google.cn, <script type="text/javascript"> function createobj() { if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { return new XMLHttpReq

  • ASP.NET MVC中EasyUI的datagrid跨域调用实现代码

    最近项目中需要跨域调用其他项目的数据,其他项目也是使用的EasyUI的datagrid组件,开始以为直接在datagrid的url属性定义为其他项目的url地址即可,可是测试下发现的确是返回了json数据但是json数据提示"invalid label" 错误,网上搜索了下错误解决办法,参考 "JavaScript处理Json的invalid label错误解决办法"的方法利用datagrid的loadData方法加载并转换了json还是提示上述错误,感觉原因不在格

  • JQuery Ajax 跨域访问的解决方案

    具体情况有: 一.本域和子域的相互访问: http://www.aa.com/和book.aa.com 二.本域和其他域的相互访问: http://www.aa.com/和http://www.bb.com/ 用 iframe 三.本域和其他域的相互访问: http://www.aa.com/和http://www.bb.com/ 用 XMLHttpRequest访问代理 四.本域和其他域的相互访问: http://www.aa.com/和http://www.bb.com/ 用 JS创建动态脚

  • asp.net Cookie跨域、虚拟目录等设置方法

    Cookie有三个属性需要注意一下: . Domain 域 . Path 路径 . Expires 过期时间 跨域操作需要设置域属性: Response.Cookies("MyCookie").Domain = "jb51.net"; (这里指的是泛域名) 这样在其它二级域名下就都可以访问到了, ASP 和 ASP.NET 测试通过 虚拟目录下访问: 我在ASP端做了下测试,.NET的没试, 如果不指定Path属性, 不同虚拟目录下Cookie无法共享 将Respo

随机推荐