【问题标题】:Cors request working in Excel but not in JavascriptCors 请求在 Excel 中工作,但不在 Javascript 中
【发布时间】:2017-05-18 23:46:07
【问题描述】:

我了解 CORS 政策,并且由于服务器未设置为接受 CORS 请求,我应该无法从其他来源下载 CSV 文件。但是,当请求是由 Excel 中的 VBA 发出时,服务器似乎非常乐意完成请求。那么为什么我不能使用 Javascript 获取相同的文件呢?

在 Excel 中:

Sub transfercsv()
sCSVLink = "https://subdomain.domain.com/specific_page/pending_csv?var=specificLocation"
sfile = "Filename_Specific_Location_" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & ".csv"
ssheet = "CSV Transfer"
Set wnd = ActiveWindow
Application.ScreenUpdating = False
Sheets(ssheet).Cells.ClearContents
Workbooks.Open Filename:=sCSVLink
Windows("pending_CSV").Activate
ActiveSheet.Cells.Copy
wnd.Activate
Sheet1.Select
Sheets("CSV Transfer").Range("A1").Select
Sheets("CSV Transfer").Paste
Application.DisplayAlerts = False
Windows("pending_CSV").Activate
Windows("pending_CSV").Close False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Call anotherFunc
End Sub

在 Javascript 中:

function displayData(){
    //this function takes a csv and displays it as a table in the page
  var tabulate = function (data,columns) {
      var table = d3.select('body').append('table')
        var thead = table.append('thead')
        var tbody = table.append('tbody')
        thead.append('tr')
          .selectAll('th')
            .data(columns)
            .enter()
          .append('th')
            .text(function (d) { return d })
        var rows = tbody.selectAll('tr')
            .data(data)
            .enter()
          .append('tr')
        var cells = rows.selectAll('td')
            .data(function(row) {
                return columns.map(function (column) {
                    return { column: column, value: row[column] }
              })
          })
          .enter()
        .append('td')
          .text(function (d) { return d.value })
      return table;
    }
    //this function actually makes the xhr request and gets the csv
    d3.csv('https://subdomain.domain.com/specific_page/pending_csv?var=specificLocation',function (data) {
        var columns = ['column_name_1','column_name_2','column_name_3','column_name_4','column_name_5','column_name_6','column_name_7','column_name_8','column_name_9','column_name_10','column_name_11']
      tabulate(data,columns)
    })

所以上面的 Excel 代码对我来说没有问题,但是上面的 Javascript 代码给了我一个安全错误:

跨域请求被阻止:同源策略不允许读取位于https://subdomain.domain.com/specific_page/pending_csv?var=specificLocation 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。

另外,我无法控制服务器。该应用程序由我公司的另一个团队控制(在不同的位置)我很惊讶 CORS 生效,因为我的域是:mydomain.somebs.domain.com 他们的域是:他们的域.domain.com 所以我不能只需在他们的服务器策略中接受我的子域即可。

所以我应该有办法用 Javascript 获取这个资源吧?

【问题讨论】:

  • 您对服务器有控制权吗?为了允许 CORS 请求,您需要让服务器返回一个带有您的域(或 *)作为值的 Access-Control-Allow-Origin 标头,正如您收到的错误所示。
  • 我想我应该更具体一些。我无法控制服务器。该应用程序由我公司的另一个团队控制(在不同的位置)我很惊讶 CORS 生效,因为我的域是:mydomain.somebs.domain.com 他们的域是:他们的域.domain.com 所以我不能只需在他们的服务器策略中接受我的子域。更新初始帖子。
  • 由于服务器返回 csv,jsonp 不是一个选项 - 我相信最干净的选择是联系负责服务器的团队并让他们添加 CORS 标头并指定基本域: Access-control-allow-origin: https://domain.com

标签: javascript excel cors vba


【解决方案1】:

因为 CORS 通常是浏览器策略,Excel 并不关心 CORS 策略,因为 Excel 并不真正容易受到浏览器每天面临的场景的影响(运行 javascript 的虚假网站从真实站点中提取数据。)如果您正在做的只是一种临时方案,您可以在浏览器中禁用 CORS 策略,但这不适用于生产网站。

我的建议是在服务器端脚本中使用一些 php 来下载 CSV,然后打印其内容..

类似...

<?php
echo file_get_contents('http://otherdomain.com/that_csv_file.csv');
?>

然后将您的 javascript 网址指向您现在的“同域”php 脚本。

【讨论】:

  • 感谢您的快速建议。这是有效的响应。尽管您无法使用 ajax 从客户端获取资源并摆弄它,但这对我来说毫无意义,但您可以从服务器端获取它并将数据泵入 javascript 并摆弄它......我会必须进一步了解 CORS 应该防止什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2015-03-08
  • 2018-06-04
  • 2023-03-04
  • 2019-11-29
  • 2021-02-21
  • 2016-10-23
相关资源
最近更新 更多