window.open 带标题

IT技术 javascript window.open
2021-01-28 16:46:44

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

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

我需要一些狡猾的黑客。

6个回答

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

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

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

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

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

不需要自定义标题。只是基本身份验证。你怎么把它传递给window.open()?
2021-03-15 16:46:44
2021-03-19 16:46:44
这对于 <a href="..." target="_blank"> 有什么不同吗?这似乎保留了登录状态。
2021-03-26 16:46:44
@sureshvv — 不。您也无法控制发送到那里的标头。如果它保留登录状态,那是因为登录方法不使用自定义标头。
2021-03-29 16:46:44
即使使用 XHR,对标头自定义的支持也有限(w3.org/TR/XMLHttpRequest/#the-setrequestheader-method
2021-04-03 16:46:44

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

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

查询字符串使用 https 加密。stackoverflow.com/questions/2629222/...但是你仍然不应该在查询字符串中放置任何敏感信息... OP 没有指定他们想要在查询字符串中放置什么样的标题。
2021-04-07 16:46:44
是不是在查询字符串中添加标题容易受到任何安全问题的影响?因为它不会在 https 中加密。
2021-04-13 16:46:44

遗憾的是,您在执行 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 缓存

作为最好的 anwser 使用XMLHttpResponseexcept编写的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
    }

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


  1. 编写 Ajax 方法以在单独的 HTML 文件中调用带有标题的特定 URL,并在<i>window.open()</i> 此处使用该 HTML 作为 urlabc.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) {

        } });

调用html

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

如果请求的 URL 中未启用 CORS,则这里 CORS 策略可以阻止请求


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

假设在 Java Servlet(/requestURL) 中我们会发出这个请求

`

        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 window.open('/requestURL')