window.open with headers

时间:2010-12-01 15:32:39

标签: javascript window.open

我可以控制window.open(跨浏览器)发送的HTTP标头吗?

如果没有,我可以以某种方式window.open一个页面然后在其弹出窗口中使用自定义标题发出我的请求吗?

我需要一些狡猾的黑客。

7 个答案:

答案 0 :(得分:31)

  

我可以控制window.open(跨浏览器)发送的HTTP标头吗?

没有

  

如果没有,我可以以某种方式打开窗口。打开一个页面,然后在其弹出窗口中使用自定义标题发出我的请求吗?

  • 您可以请求触发服务器端程序的URL,该程序使用任意标头发出请求,然后返回响应
  • 您可以运行JavaScript(可能告别渐进增强),它使用XHR以任意标头发出请求(假设URL符合同源策略),然后在JS中处理结果。
  

我需要一些狡猾的黑客......

如果您描述了问题而不是询问可能的解决方案是否有效,这可能有所帮助。

答案 1 :(得分:9)

如果您控制服务器端,可以在查询字符串中设置标头值并像这样发送它? 这样,如果在标题中找不到它,你可以从查询字符串中解析它。

只是一个想法......你要求一个狡猾的黑客:)

答案 2 :(得分:0)

除了XMLHttpResponse以外,最好的anwser使用window.open编写,我将abstracts-anwser作为实例。

主要Js文件是download.js Download-JS

 // var download_url = window.BASE_URL+ "/waf/p1/download_rules";
    var download_url = window.BASE_URL+ "/waf/p1/download_logs_by_dt";
    function download33() {
        var sender_data = {"start_time":"2018-10-9", "end_time":"2018-10-17"};
        var x=new XMLHttpRequest();
        x.open("POST", download_url, true);
        x.setRequestHeader("Content-type","application/json");
//        x.setRequestHeader("Access-Control-Allow-Origin", "*");
        x.setRequestHeader("Authorization", "JWT " + localStorage.token );
        x.responseType = 'blob';
        x.onload=function(e){download(x.response, "test211.zip", "application/zip" ); }
        x.send( JSON.stringify(sender_data) ); // post-data
    }

答案 3 :(得分:0)

  

您不能在弹出窗口中使用 window.open()直接添加自定义标头   但是要工作,我们有两种可能的解决方案


  
      
  1. 编写Ajax方法以在单独的HTML文件中使用标头来调用该特定URL,并使用该HTML作为Task.Run中的URL   这是 abc.html
  2.   
<i>window.open()</i>

调用html

        $.ajax({
        url: "ORIGIONAL_URL",
        type: 'GET',
        dataType: 'json',
        headers: {
            Authorization : 'Bearer ' + data.id_token,
            AuthorizationCheck : 'AccessCode ' +data.checkSum , 
            ContentType :'application/json'
        },

        success: function (result) {
              console.log(result);
        },
        error: function (error) {

        } });
  

如果未在请求的网址中启用CORS,则CORS策略可以阻止请求。


  
      
  1. 您可以请求一个URL,该URL触发一个服务器端程序,该程序使用自定义标头发出请求,然后返回重定向到该特定url的响应。
  2.   

假设在Java Servlet(/ requestURL)中,我们将发出此请求

`

window.open('*\abc.html')

`

String[] responseHeader= new String[2]; responseHeader[0] = "Bearer " + id_token; responseHeader[1] = "AccessCode " + checkSum; String url = "ORIGIONAL_URL"; URL obj = new URL(url); HttpURLConnection urlConnection = (HttpURLConnection) obj.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoInput(true); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/json"); urlConnection.setRequestProperty("Accept", "application/json"); urlConnection.setRequestProperty("Authorization", responseHeader[0]); urlConnection.setRequestProperty("AuthorizationCheck", responseHeader[1]); int responseCode = urlConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String inputLine; StringBuffer response1 = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response1.append(inputLine); } in.close(); response.sendRedirect(response1.toString()); // print result System.out.println(response1.toString()); } else { System.out.println("GET request not worked"); } 中调用servlet

答案 4 :(得分:0)

遗憾的是,您在执行 window.open() 时无法控制标题

又好又容易,我是如何设法打开带有自定义标题的文件的:

const viewFile = async (url) => {

  // Change this to use your HTTP client
      fetch(url, {/*YOUR CUSTOM HEADER*/} ) // FETCH BLOB FROM IT
        .then((response) => response.blob())
        .then((blob) => { // RETRIEVE THE BLOB AND CREATE LOCAL URL
          var _url = window.URL.createObjectURL(blob);
          window.open(_url, "_blank").focus(); // window.open + focus
      }).catch((err) => {
        console.log(err);
      });
};
  • 下载文件到缓存
  • window.open 缓存

答案 5 :(得分:-3)

看起来在6年内已经提供了解决方案。检查这里提供的答案:

how to add authentication header to $window.open

答案 6 :(得分:-4)

改为使用POST

尽管使用window.open()构造GET查询很容易,但这是一个坏主意(请参见下文)。一种解决方法是创建一个提交POST请求的表单。像这样:

<form id="helper" action="###/your_page###" style="display:none">
<inputtype="hidden" name="headerData" value="(default)">
</form>

<input type="button" onclick="loadNnextPage()" value="Click me!">

<script>
function loadNnextPage() {
  document.getElementById("helper").headerData.value = "New";
  document.getElementById("helper").submit();
}
</script>

当然,您需要在服务器端进行一些处理;正如其他人建议的那样,您可以创建一个“代理”脚本来代表您发送标头并返回结果。

关于GET的问题

  • 查询字符串存储在浏览器历史记录中,
  • 可以肩膀冲浪
  • 复制粘贴
  • 通常您不希望“刷新”同一笔交易很容易。