Javascript window.openwithheaders

Javascript window.openwithheaders,javascript,window.open,Javascript,Window.open,我可以控制窗口发送的HTTP头吗?打开(跨浏览器) 如果没有,我是否可以打开窗口。打开一个页面,然后在弹出的窗口中发出带有自定义标题的请求 我需要一些狡猾的黑客 我可以控制window.open(跨浏览器)发送的HTTP头吗 没有 如果没有,我是否可以打开一个窗口。打开一个页面,然后在弹出的窗口中发出带有自定义标题的请求 您可以请求一个URL,该URL触发服务器端程序,该程序使用任意头发出请求,然后返回响应 您可以运行JavaScript(可能告别渐进式增强),它使用XHR发出带有任意头的请求

我可以控制
窗口发送的HTTP头吗?打开
(跨浏览器)

如果没有,我是否可以打开
窗口。打开一个页面,然后在弹出的窗口中发出带有自定义标题的请求

我需要一些狡猾的黑客

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

没有

如果没有,我是否可以打开一个窗口。打开一个页面,然后在弹出的窗口中发出带有自定义标题的请求

  • 您可以请求一个URL,该URL触发服务器端程序,该程序使用任意头发出请求,然后返回响应
  • 您可以运行JavaScript(可能告别渐进式增强),它使用XHR发出带有任意头的请求(假设URL符合同一源策略),然后在JS中处理结果
我需要一些狡猾的黑客


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

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


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

作为最好的anwser使用
XMLHttpResponse
编写,除了
窗口。打开
,我将摘要anwser作为一个实例

主Js文件是
download.Js

//var download\u url=window.BASE\u url+“/waf/p1/download\u rules”;
var download\u url=window.BASE\u url+“/waf/p1/download\u logs\u by\u dt”;
函数下载33(){
var发送方数据={“开始时间”:“2018-10-9”,“结束时间”:“2018-10-17”};
var x=新的XMLHttpRequest();
x、 打开(“POST”,下载\u url,true);
x、 setRequestHeader(“内容类型”、“应用程序/json”);
//x.setRequestHeader(“访问控制允许来源”,“*”);
x、 setRequestHeader(“授权”、“JWT”+localStorage.token);
x、 responseType='blob';
x、 onload=function(e){download(x.response,“test211.zip”,“application/zip”);}
x、 send(JSON.stringify(sender_data));//发布数据
}
您不能直接使用弹出窗口中的window.open()添加自定义标题 但要做到这一点,我们有两种可能的解决方案


  • 编写Ajax方法,在单独的HTML文件中使用标题调用特定的URL,并在
    window.open()中将该HTML用作URL
    这里是abc.html
  • 调用html

    window.open('*\abc.html')
    
    如果请求的URL中未启用CORS,则CORS策略可以阻止请求


  • 您可以请求触发服务器端程序的URL,该程序使用自定义头发出请求,然后返回重定向到该特定URL的响应
  • 假设在Javaservlet(/requestURL)中,我们将发出此请求

    `

    `

    窗口中调用servlet。打开('/requestURL')

    改用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>
    
    
    函数loadNnextPage(){
    document.getElementById(“helper”).headerData.value=“新建”;
    document.getElementById(“helper”).submit();
    }
    
    当然,您需要服务器端的一些东西来处理这个问题;正如其他人建议的那样,您可以创建一个“代理”脚本,代表您发送标题并返回结果

    GET的问题

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

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

        非常简单,我是如何用自定义标题打开文件的:

        const viewFile=async(url)=>{
        //将此更改为使用HTTP客户端
        获取(url,{/*您的自定义头*/})//从中获取BLOB
        .then((response)=>response.blob())
        .then((blob)=>{//检索blob并创建本地URL
        var\u url=window.url.createObjectURL(blob);
        window.open(_url,“_blank”).focus();//window.open+focus
        }).catch((错误)=>{
        控制台日志(err);
        });
        };
        
        • 下载文件到缓存
        • window.opentocache

        即使使用XHR,对标题定制的支持也有限()@FreeConsulting链接实际上是:这与XHR不同吗?这似乎保留了登录状态。@sureshvv-否。您也无法控制发送到那里的标题。如果它保留登录状态,那是因为登录方法不使用自定义头。不需要自定义头。只是基本的授权。如何将其传递给window.open()?在查询字符串中添加头不容易受到任何安全问题的影响吗?因为它不会用https加密。QueryString是用https加密的。但您仍然不应该在查询字符串中放入任何敏感信息。。。OP没有指定要在查询字符串中放入何种类型的头。
                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");
                }
        
        <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>