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>