实现 HTTP 代理以克服跨站点 AJAX 请求限制 (?)

Posted

技术标签:

【中文标题】实现 HTTP 代理以克服跨站点 AJAX 请求限制 (?)【英文标题】:Implementing an HTTP proxy to overcome cross-site AJAX requests restrictions (?) 【发布时间】:2011-07-02 10:47:15 【问题描述】:

我有一个 Spring-MVC webapp (3.0.5-RELEASE),它需要从不同子域上的另一个 webapp(通过 AJAX 从客户端/浏览器)访问 JSON web 服务。

我过去通过以下任一方式解决了这个问题:

    编写一个代理请求的简单控制器,使用 Apache Commons HttpClient 来处理请求。从而克服了大多数浏览器的跨站/跨域请求安全限制

    在服务器端实现 JSONP 服务(调用我们自己的 JSON 服务时)- 并非总是可行

在无法使用 JSONP 的情况下,有没有更好的方法(1.)?

和/或

是否有图书馆可以为我处理这个问题?所以我不必自己编写所有HttpClient 代码——代码不多,但我想知道我是否(严重)重新发明了***。

【问题讨论】:

【参考方案1】:

我经常不得不使用第三方 Web 服务 (API),正如您所提到的,JSONP 并不总是一种选择。我就是这样设计的:

    如果 API 以用户为中心,它必须提供一个 jsonp 接口,这就是我将使用的。以用户为中心意味着您无法理解调用 API 的任何理由,对响应进行一些计算,可能会调用您的 ajax 服务之一,然后组合响应并显示给用户。

    1234563 .我会改为使用 RestTemplate 并对服务进行后端 api 调用。在这种情况下,没有跨域限制。

使用服务器代理绕过 jsonp 的唯一情况是当您创建允许人们构建自定义插件的产品时,这些插件托管在您的页面上,但需要对应用程序开发人员服务器进行 Ajax 调用。这是一个非常复杂的案例! (例如,看看 Apigee 如何围绕您现有的 url 创建面向公共的 REST API,或者 Zendesk 如何允许您开发应用程序)

希望这会有所帮助。

【讨论】:

我同意你的逻辑并且已经广泛使用 RestTemplate 来做额外的处理。然而,我们在这里谈论的是现实世界,通常存在第三种可能性: 3. API 以用户为中心,但不提供 JSONP - 是的,它应该提供,但无论出于何种原因它都没有。所以我的问题是,在这种情况下,您使用什么服务器端库/api 来实现代理(或其他解决方案)? 对于像你提到的情况,我选择第 2 点。意思是我的前端调用我的后端(没有跨站点问题),然后从我的服务器端代码调用第三方 api。我永远不会推荐使用库/重定向规则来代理第三方 API。这种方法具有很大的灵活性,例如您可以在后端过滤数据并仅将必要的数据发送到您的页面。此外,它不会将您的前端代码耦合到第三方 API 请求和响应。所以我们很清楚,我不是作为一个理想主义者这么说,这是我在现实生活中遇到的问题。

以上是关于实现 HTTP 代理以克服跨站点 AJAX 请求限制 (?)的主要内容,如果未能解决你的问题,请参考以下文章

前端设置请求头可以解决跨域问题吗

前端开发:深入使用proxy代理解决跨域问题

nodejs 代理 解决开发环境跨域问题

带有 php 代理的 AJAX 状态代码 0

nginx 解决AJAX 跨域问题。

ajax跨域之---服务器端代理实现