【问题标题】:CORS Issue with Legacy System - No 'Access-Control-Allow-Origin' header旧系统的 CORS 问题 - 没有“Access-Control-Allow-Origin”标头
【发布时间】:2016-05-26 02:24:04
【问题描述】:

--Ajax 方法调用以获取 HTML 格式的响应

function send_with_ajax(brand) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function() { alertContents(httpRequest); };  
    httpRequest.open("GET", "https://XXXX--LEGACY SYSTEM--XXXX", true);
    httpRequest.setRequestHeader( 'Access-Control-Allow-Origin', 'https://XXXX--LEGACY SYSTEM's IP Address--XXXX/');
    httpRequest.send(null);
}

function alertContents(httpRequest) {
    alert(httpRequest.readyState);
    if (httpRequest.readyState == 4) {
        // everything is good, the response is received
        if ((httpRequest.status == 200) || (httpRequest.status == 0)) {
            //Get the httpRequest.responseText
        } else {
            //Error with the response or Failed to load the response;
        }
    }
}

嗨,在上面的 JS 代码中,我创建了一个 activeX 对象来访问遗留系统(这意味着端点 Java 中不存在与 CORS 相关的 API)。 同样,我希望收到 HTML 格式类型的响应。这在 IE(HTML 代码类型)中运行良好,但是当使用 Chrome(移植到 HTML5 代码类型)尝试相同时,我最终遇到了 CORS 问题。好的......它发生了,我试图在这里设置标题以解决它,但它也徒劳无功。有没有办法解决这个问题。请注意,我正在尝试与端点 java 组件无法进行任何修改的遗留系统进行交互。请帮忙!!!

【问题讨论】:

  • access-control-allow-origin 标头设置在 response 中,而不是请求中...实际上,在请求中设置它们可能会产生不利影响
  • legacy system where endpoint java component cannot have any amendments - 基本上你有两个选择,修改服务器,或者使用你的页面提供的服务器为你发出请求
  • 你正要说客户端和服务都应该驻留在同一台机器上才能解决这个问题......不是吗???
  • 不...您显然有两个服务器 - 一个使用上面显示的代码为您的页面提供服务,第二个是旧服务器..您将使用第一台服务器作为代理遗产 - 正如 TJ Crowder 的回答中所述

标签: javascript html cors cross-domain activexobject


【解决方案1】:

您没有在请求中设置Access-Control-Allow-Origin,而是在响应中设置它(以及其他几个必需的标头)。服务器是决定是否允许跨域请求的地方(浏览器随后执行的决定)。

我正在尝试与端点 java 组件不能有任何修改的遗留系统交互

那么你不能直接使用来自另一个来源的 ajax 来查询它。相反,您需要某种代理,例如在服务器(或另一台服务器)上运行的第二个进程,您可以查询该代理,进而查询您实际想要与之交谈的那个。之所以可行,是因为 SOP 适用于来自浏览器的请求,但非浏览器可以根据需要进行跨域请求。

那里有几个“CORS 代理”项目(对它们来说这是一个合理的搜索词),既可以在服务器上运行,也可以像 crossorigin.me 一样直接使用(只是一个例子,不是认可;不知道好不好用)。如果您使用服务,自然必须信任他们,因为所有数据(双向)都流经他们的服务器......

【讨论】:

  • 有没有其他方法不使用间歇性组件(代理服务器)???我的是一个独立的 HTML 页面......它不需要任何其他依赖项......最终它以传统的 HTML 方式与 IE 一起工作......我也想在 chrome 中保留这个属性以及 HTML5 ...... . 如果没有别的办法......将不得不与代理服务器意识形态一起去:)
  • @VijayLMarcelin:嗯,正如我上面所说,有一些服务可以为你做代理。您也可以use YQL as a cross-domain proxy,但这是否适合您将在很大程度上取决于您从其他来源阅读的内容。
  • 感谢@CrowderTJ!会去看看
【解决方案2】:

克服跨域限制的一种方法是使用 yql yahoo 控制台。您可以在具有不同域的站点之间传输数据(也可以是 html)。您可以查看here。在左侧菜单转到 data->html 并进行类似select * from html where url="http://your.different.domain.com" 的查询然后只需使用 yahoo 提供的 url 即可,没有限制问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2019-06-17
    • 2016-05-13
    • 2015-12-28
    • 2017-12-11
    • 2021-10-20
    • 2018-03-04
    • 2018-09-19
    相关资源
    最近更新 更多