`
wxlgzxx_1988
  • 浏览: 67802 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ajax跨域请求的解决办法

阅读更多

由于项目需要,对项目进行优化,将项目中的一部分动态页面生成静态页面来提高访问的速度,随后这些静态页面与web服务器分开,存于其他服务器,并为其指定了二级域名。问题来了,导致以前写的ajax全部over。

  于是埋头苦找问题,照旧,在ajax的后提方法中设置断点,不料,断点尽然跳不进,后来,将ajax方法中与后台交互的url改为全路径(不用相对路径),结果,断点顺利进入,欣喜若狂。于是将所有url改为全路径,以为问题得到解决。后来发现ajax后台能够正常执行,但是页面上的ajax回调方法却没被执行。

  由于之前没有类似经验,于是google百度一番,发现这是一个ajax跨域问题。网上给出的不外乎以下几种方法:

1.web端代理的方式,即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果。

2.iframe,解决方案就是用window.location对象的hash属性,利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信,大体就是AB网站各嵌入一个对方网站的iframe,然后通过连续不断的监听hash值的变化来进行通信。比如A网站通过改变B网站iframe的hash后,B网站监听到hash的变化后就进行处理,这种方式需要开发者可以控制两个网站的代码。

3.通过script标签来请求,原理就是在本域内的A内生成一个JS标签,它的SRC指向请求的另外一个域的某个页面B,这个src里面通常会加一个A页面定义好的回调函数,B返回数据即可,可以直接返回调用这个回调函数,这种跨域的通信方式被称为JSONP,此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式,如果请求时传递的字符串过大时,可能会无法正常运行。

4.window.name,window.name是一种解决跨域数据传输的新技术,通过在iframe中加载一个跨域的HTML文件,并且在HTML文件中设置window.name的值为需要传给接受者的数据,接收者就可以取得到window.name的值并且返回,比较关键的是同源策略的影响对location的控制不受限制,所以需要加载一个代理的页面来让发送页面读取window.name.

5.使用flash,原理是JavaScript将数据提交给本域下的 Flash,通过 Flash 中转去访问其他域的接口,只需要其他域的根目录下有一个crossdomain.xml文件,文件中设置允许所有域名或允许本域访问即可。

 

 

先说说自己项目的ajax架构:采用jquery1.6.2和struts2注解的形式

后台struts2示例代码:

@SuppressWarnings("serial")
@ParentPackage("json-default")
@Results( { @Result( type = "json })

public class BaserAjaxAction extends BaseAction {

    

Map<String, String> map = new HashMap<String, String>();

/**
  * 是否登录
  *
  * @return
  * @throws Exception
  */
 public String isAreadyLogin() throws Exception {
  try {
   Object mid = this.getReq().getSession().getAttribute(
     SessionKey.BASER_ID);
   Object mname = this.getReq().getSession().getAttribute(
     SessionKey.USER_NAME);
   Object pic = this.getReq().getSession().getAttribute(
     SessionKey.BASER_PIC);
   if (null != mid && null != mname) {
    map.put("result", "true");
    map.put("userId", mid.toString());
    map.put("userName", mname.toString());
    if (pic != null && !"".equals(pic)) {
     map.put("pic", Constant.UPLOAD_USER_IMAGE_DIR + pic);
    }
   } else {
    map.put("result", "false");
   }
  } catch (Exception e) {
   logger.error("isLogin", e);
  }
  return SUCCESS;
 }

public Map<String, String> getMap() {
  return map;
 }

 public void setMap(Map<String, String> map) {
  this.map = map;
 }

}

 代码很简单,这里采用注解的方式,这是利用struts2-json-plugin这个插件,采用json的数据传递格式与前台js交互。注意:这里map当然可以根据需要定义其他的存数数据的集合和数据类型。但是一定要有get方法,否则前台将不能正常得到数据信息(好好研究下struts2-json-plugin这个插件就知道了)。很方便 

 

前台代码:

function isLogin() {
 $.ajax( {
  type : 'post',
  url : basePath+'/front/baser_ajax!isAreadyLogin.action',
  dataType : 'json',
  success : isLoginCallback
 });
}

function isLoginCallback(data) {
 var htmlCode = "";
 if (data.map.result == "true") {
  htmlCode += "<a class='login_act' target='_blank' href=\'" + basePath
    + "/user/visterHome-" + data.map.userId + ".html'>"
    + data.map.userName + "</a>";
  htmlCode += "<a class='login_act' href='javascript:loginOut();'>退出</a>";
  htmlCode += "<a class='file_upload' href='javascript:checkLoginOn();'>上传视频</a>";
  document.getElementById('isLogin').value = data.map.userId;
  $('#afterLoginId_').html(htmlCode);
 }
}

 

这里也很简单,就是通过url : basePath+'/front/baser_ajax!isAreadyLogin.action',跟后台的名为baser_ajax这个action中的isAreadyLogin方法交互,得到一些数据,再填充到页面,

但是对我来说,显然这以上所说的几种解决方案对我来说都不太实际,要改动很多代码,后来看到一篇关于jquery跨域的文章(忘记链接地址了),虽然说的不是很完全,但是对我帮助很大,里面说到采用第三方的一个协议jsonp. 于是就尝试,把  dataType : 'json',换成  dataType : 'jsonp',  后台struts2注解加上params = {
  "callbackParameter", "callback" }),name = "success" 结果搞定。

完整代码:

@SuppressWarnings("serial")
@ParentPackage("json-default")
@Results( { @Result(name = "SUCCESS", type = "json", params = {
  "callbackParameter", "callback" }) })
public class BaserAjaxAction extends BaseAction {

..................}

 

 

function isLogin() {
 $.ajax( {
  type : 'post',
  url : basePath+'/front/baser_ajax!isAreadyLogin.action',
  dataType : 'jsonp',
  success : isLoginCallback
 });
}

function isLoginCallback(data) {
 var htmlCode = "";
 if (data.map.result == "true") {
  htmlCode += "<a class='login_act' target='_blank' href=\'" + basePath
    + "/user/visterHome-" + data.map.userId + ".html'>"
    + data.map.userName + "</a>";
  htmlCode += "<a class='login_act' href='javascript:loginOut();'>退出</a>";
  htmlCode += "<a class='file_upload' href='javascript:checkLoginOn();'>上传视频</a>";
  document.getElementById('isLogin').value = data.map.userId;
  $('#afterLoginId_').html(htmlCode);
 }
}

 

希望对有需要的人有所帮助!

 

 

分享到:
评论
1 楼 gteam.yu 2011-11-08  
感觉和一般的ajax请求差不多,没有看到跨域的那个部分。(是不是我理解不够哦)

相关推荐

    解决ajax跨域请求问题

    本文将深入探讨如何解决Ajax跨域请求的问题。 首先,理解“同源策略”是解决问题的关键。同源策略是浏览器为了保障网络安全而设定的一种机制,它禁止了一个源的文档或脚本访问另一个源的属性,这里的“源”指的是...

    ajax跨域解决办法

    6. **Domain属性(仅限子域)**:在cookies中设置`domain`属性可以实现跨子域共享,但这仅限于同一主域下的子域名之间,对AJAX跨域请求帮助有限。 在实际应用中,开发者通常根据项目需求和服务器环境选择合适的跨域...

    Jquery跨域Ajax请求测试

    jQuery,作为一个强大的JavaScript库,提供了便捷的方式来处理这种问题,特别是通过其Ajax功能进行跨域请求。本示例"Jquery跨域Ajax请求测试"将详细讲解如何利用jQuery实现这一功能。 首先,了解同源策略是理解跨域...

    Ajax跨域请求解决方案-JSONP

    总的来说,JSONP是Ajax跨域请求的一种实用解决方案,尤其适用于只支持GET请求且不涉及复杂交互的场景。但是,它也有一些局限性,比如不支持POST请求、无法控制HTTP头部、无错误处理机制等。因此,在现代Web开发中,...

    ajax跨域请求jsonp前后台代码

    基于ajax方式的跨域请求jsonp的前后台代码

    ajax跨域请求WebService.asmx

    【Ajax跨域请求WebService.asmx】是一个常见的Web开发技术应用场景,主要涉及到JavaScript的Ajax技术、C#编程语言以及ASP.NET的WebService组件。Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的...

    ajax跨域请求

    ### AJAX跨域请求详解 #### 一、引言 在Web开发中,由于浏览器的同源策略限制,AJAX请求通常只能向同源服务器发送请求。然而,在实际应用中,跨域请求的需求非常常见。本篇文章将通过一个具体的示例(JSP页面+后台...

    ajax跨域请求demo.zip

    这个"ajax跨域请求demo.zip"压缩包提供了一个关于如何实现Ajax跨域请求的示例,涉及到前后端的交互。 首先,我们关注"前端代码"部分。前端通常使用JavaScript库如jQuery来实现Ajax请求。jQuery的`$.ajax()`方法是...

    Ajax跨域访问解决方案

    **Ajax跨域访问解决方案** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提升用户体验。然而,由于浏览器的同源策略限制,Ajax请求只能向同源(协议、域名和端口相同)...

    ajax处理跨域请求

    当使用AJAX进行跨域请求时,我们需要采取特殊的方法来规避同源策略。这里将详细讲解如何通过jQuery的AJAX实现跨域请求。 首先,了解什么是CORS(Cross-Origin Resource Sharing,跨源资源共享)。CORS是一种机制,...

    jsonpajax跨域请求

    4. AJAX跨域: AJAX本身不支持跨域,但是通过CORS(Cross-Origin Resource Sharing,跨源资源共享)机制,可以实现AJAX的跨域请求。服务器需要在响应头中添加`Access-Control-Allow-Origin`字段,允许指定的源进行...

    html通过 ajax jsonp跨域请求接收和传送数据

    1. **AJAX跨域**: 通常,AJAX请求受到同源策略限制。为实现跨域,我们可以使用CORS(Cross-Origin Resource Sharing)机制。服务器需要在响应头中添加`Access-Control-Allow-Origin`字段,允许特定的源进行跨域访问...

    ajax 跨域请求问题 jquery jsonp

    **Ajax跨域请求问题与jQuery JSONP解析** 在Web开发中,Ajax技术被广泛用于实现页面的异步更新,但浏览器的同源策略(Same-Origin Policy)限制了Ajax请求只能向同源(协议、域名、端口均相同)的服务器发送。这在...

    AJAX(XMLHttpRequest)进行跨域请求方法详解

    AJAX(XMLHttpRequest)进行跨域请求方法详解 AJAX(XMLHttpRequest)跨域请求是指一个站点中的资源访问另外一个不同域名站点上的资源。这种情况很常见,比如说通过style标签加载外部样式表文件、通过img标签加载外部...

    利用JQuery jsonp实现Ajax跨域请求json数据

    本篇文章将详细讲解如何利用jQuery的jsonp方法实现Ajax跨域请求,以及如何在服务器端使用.Net的*.handler和WebService来返回JSON数据。 首先,理解JSONP的基本原理。JSONP是一种非官方的协议,通过动态创建`...

    Javascript跨域和Ajax跨域解决方案

    在Ajax请求中,可以利用以上提到的JSONP或CORS方法解决跨域问题。对于CORS,需要确保服务器返回正确的CORS响应头;而对于JSONP,需要服务器支持JSONP格式的响应。 在提供的文件列表中,`HttpClient.class.php`可能...

    基于CORS实现WebApi Ajax 跨域请求解决方法

    ## 基于CORS实现WebApi Ajax 跨域请求解决方法 在现代Web开发中,API服务常常被多个前端应用调用,这就涉及到跨域请求的问题。由于浏览器的安全策略,JavaScript的同源策略(Same-Origin Policy)禁止了不同源之间...

    juery mobile使用ajax跨域请求服务器的小实例

    在这里,我们将探讨如何利用jQuery Mobile和Ajax实现跨域请求。 首先,理解什么是跨域请求。由于浏览器的安全策略,JavaScript通常被限制在同源策略之下,即只能访问与当前页面相同协议、域名和端口的资源。但有时...

    Ajax跨域问题及其解决方案.docx

    ### Ajax跨域问题及其解决方案 #### 一、Ajax跨域问题概述 在现代Web开发中,前后端分离架构越来越流行。这种模式下,前端页面与后端服务通常部署在不同的服务器上,甚至可能位于不同的域名下。当浏览器发起对不同...

Global site tag (gtag.js) - Google Analytics