【问题标题】:html <script> tag headershtml <script> 标签头
【发布时间】:2019-08-25 18:17:39
【问题描述】:

我试图要求一个带有标头身份验证系统防火墙的脚本,并试图找到解决方法。

到目前为止,很明显,您无法将自定义标头添加到脚本标记中,但我已经看到了一些关于在请求之前或在服务器端自定义页面上的标头的内容。

到目前为止,我不能说我已经看到了任何可靠的答案。

【问题讨论】:

  • 下载 scipt,自行托管或使用一些免费托管服务
  • 我无法下载。这是脚本是必须从在线包含的框架的一部分
  • 那我想你可能得和管理脚本托管服务器的人谈谈

标签: html script-tag custom-headers


【解决方案1】:

这是一个简单的 Ajax 函数,您可以使用它来获取脚本的内容:

function get(url, callback) {
  var request = new XMLHttpRequest();
  request.open("GET", url, true);
  request.onreadystatechange = function() {
    if(this.readyState === 4) {
      if(this.status >= 200 && this.status < 400) {
        callback.apply(this, [this.responseText, this]);
      } else {
        // something went wrong.
      }
    }
  };
  request.send();
}

由于您需要设置自定义标头,因此您还可以使用request.setRequestHeader 方法,如下所示:

function get(url, callback) {
  var request = new XMLHttpRequest();
  request.open("GET", url, true);
  // BEGIN: CUSTOM HEADERS
  request.setRequestHeader("Header-Name", "header/value");
  request.setRequestHeader("Other-Header", "other/value");
  // END: CUSTOM HEADERS
  request.onreadystatechange = function() {
    if(this.readyState === 4) {
      if(this.status >= 200 && this.status < 400) {
        callback.apply(this, [this.responseText, this]);
      } else {
        // something went wrong.
      }
    }
  };
  request.send();
}

最后,你会像这样使用这个函数:

get("url/to/your/script", function(response) {
  // perform checks...
  window.eval(response);
});

警告:非常、非常在使用eval时要小心,千万不要eval你不信任的东西请记住eval 可能是邪恶的。

【讨论】:

  • 您好,只是一个问题。我可以在 php 中获取此内容,而 curl 请求没有问题。但正如我在上面的 cmets 中所述。我遇到了 CORS 问题。但是我将来自 php 的请求响应存储在一个 var 中。我可以使用 php 中的响应文本来设置而不是 js ajax 请求吗?我问的唯一原因是因为当我将该字符串直接输入到 eval 中时,我得到了语法错误
  • 由于您不维护脚本,因此无法解决此问题。您必须联系编写脚本的人或托管它的人,并通知他们正在发生的事情。语法错误不是由我的回答引起的(我在 jshint 中仔细检查过),如果您能够将字符串传递给 eval,那么它也不是您的代码。此错误很可能是由您尝试使用的脚本引起的,我建议您开始寻找其他选项 我确信有很多开源项目可以执行该脚本的功能,祝您好运。
  • 另外,这有点阴暗,什么样的开发人员编写了 JavaScript 库但不允许人们正常下载/包含它..?我建议您在将此库包含在生产环境中之前进行更多研究。
【解决方案2】:

您可以通过 xhr 和 eval() 在页面内加载它。例如,使用 jQuery,您可以使用: http://api.jquery.com/jquery.ajax/ - 参见beforeSend 设置标题;使用它来检索文件内容。

然后使用https://api.jquery.com/jquery.globaleval/ globalEval() 评估获得的页内内容。

你可以用香草HttpRequesteval() 达到同样的效果,但我总是懒得这样做。或许不是……我刚刚在我正在工作的项目中发现了一段代码:

var evalScript = function(e) {
  var h = evalScript.node,
      s = document.createElement("script");
  s.type = "text/javascript";
  s.text = e;
  h.appendChild(s);
  h.removeChild(s);
};
evalScript.node = document.getElementsByTagName("head")[0] || document.getElementsByTagName("*")[0];
// TODO: make async
function loadJs(js) {
  var req = new XMLHttpRequest();
  req.open("GET", js, false);
  req.send(null);
  evalScript(req.responseText);
}

只需添加标题即可。

【讨论】:

  • 我已经实现了这段代码,但我遇到了“CORS”问题。明天我将与支持人员交谈,我会尝试解决这个问题,明天我会回复您的答案。谢谢
  • 是的,他们应该添加一个 CORS 标头。如果没有,从您下面的评论中我看到您可以从服务器(PHP)访问资源。在最坏的情况下,您可以在您的域上设置一个代理,例如 /get_js.php?remote=&lt;url&gt;,它只是回显远程 的内容。但是,如果上述脚本直接向远程服务器发出自己的 ajax 请求,这不会有太大帮助。因为这种方式(代理)它们在您的域下运行,所以当他们尝试访问他们的域时,它们会触发 CORS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2012-01-10
  • 2021-10-01
  • 2020-09-06
相关资源
最近更新 更多