我可以控制window.open
(跨浏览器)发送的HTTP标头吗?
如果没有,我可以以某种方式window.open
一个页面然后在其弹出窗口中使用自定义标题发出我的请求吗?
我需要一些狡猾的黑客。
答案 0 :(得分:31)
我可以控制window.open(跨浏览器)发送的HTTP标头吗?
没有
如果没有,我可以以某种方式打开窗口。打开一个页面,然后在其弹出窗口中使用自定义标题发出我的请求吗?
我需要一些狡猾的黑客......
如果您描述了问题而不是询问可能的解决方案是否有效,这可能有所帮助。
答案 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()直接添加自定义标头 但是要工作,我们有两种可能的解决方案
- 编写Ajax方法以在单独的HTML文件中使用标头来调用该特定URL,并使用该HTML作为
Task.Run
中的URL 这是 abc.html
<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策略可以阻止请求。
- 您可以请求一个URL,该URL触发一个服务器端程序,该程序使用自定义标头发出请求,然后返回重定向到该特定url的响应。
假设在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);
});
};
答案 5 :(得分:-3)
看起来在6年内已经提供了解决方案。检查这里提供的答案:
答案 6 :(得分:-4)
尽管使用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的问题