使用jQuery同步交叉子域POST请求

时间:2009-10-16 01:38:46

标签: javascript jquery cross-domain jsonp xss

我正在尝试执行跨域POST请求并且已经打了一个墙(或两个)。

我无法在服务器上放置代理页面 - 因此这不是一个选项。

我研究了getJSON,除了我需要POST而不是GET之外,它工作得很好。

有可能这样做吗?如果不是,有人可以向我解释getJSON是如何工作的,以及为什么我不能做出替代方案。

3 个答案:

答案 0 :(得分:26)

CANNOT使用XMLHttpRequest(又名AJAX)发出跨域请求(GET / POST /等)。

当服务器支持时,您可以做的是发出JSONP请求。 JSONP请求的工作方式如下:

  • jQuery使用您作为参数提供的回调函数创建一个全局可访问的函数
  • jQuery不是使用XMLHttpRequest(AJAX)来发出HTTP请求,而是动态地将SCRIPT标记插入到DOM中
  • 脚本标记的SRC是您尝试与之通信的请求URL
  • jQuery在查询字符串中添加了一个回调参数,如下所示:example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • 然后由SERVER返回您的客户端可以使用的JavaScript,方法是将JSON结果作为参数传递给someDynamicallyGeneratedMethodName

如果您无法控制要发布的服务器,那么您运气不佳,JSONP对您没有多大好处。无论服务器返回什么都将在SCRIPT标记中,并且如果格式不正确,很可能会抛出错误。

有关这方面的更多信息,我建议您查看基本的$ .ajax函数而不是快捷方式。 (在Ajax下的jQuery文档中。抱歉,我无法发布更多链接)

同样,如果您无法控制要发布的服务器,则可能需要查看代理。否则,IFRAME可能是您唯一的其他选择。还有一种方法可以使用SWF(flash)对象来实现此目的。我既没有尝试过,但它们是XMLHttpRequest对象限制的解决方法。

希望我能帮忙!

答案 1 :(得分:2)

你可以发帖,但你想要的是一个JSONP请求来解决跨域问题。本质上,您提供了一个回调函数,请求以脚本内容的形式返回,并使用请求中的JSON数据调用您的回调。您的服务器端脚本需要使用围绕JSON对象的回调函数将数据作为函数调用提供。

请参阅post功能的文档。

$.post( '/example.com/controller/action?callback=?',
        { param: "data" }, 
        function(data) {
             ...do something with the data...
        }, 'jsonp' );

ASP.NET MVC对此的操作:

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Action( string param, string callback )
{
     var jsonData = ...do something and construct some data in JSON...

     return Content( callback + "(" + jsonData + ");" );
}

答案 2 :(得分:0)

如果您想进行跨域POST,那么最简单的解决方案是Matteo提供的here解决方案。 它对我很有用