Window.open с заголовками
Можно ли управлять заголовками HTTP, отправленными window.open
(кросс-браузер)?
Если нет, могу ли я как-то window.open
создать страницу, которая затем выдает мой запрос с настраиваемыми заголовками внутри всплывающего окна?
Мне нужны хитроумные хаки.
Ответы
Ответ 1
Можно ли управлять заголовками HTTP, отправленными window.open(кросс-браузер)?
Нет
Если нет, могу ли я каким-либо образом window.open страницу, которая затем выдает мой запрос с пользовательскими заголовками внутри всплывающего окна?
- Вы можете запросить URL-адрес, который запускает серверную программу, которая делает запрос с произвольными заголовками, а затем возвращает ответ
- Вы можете запустить JavaScript (возможно, попрощаться с Progressive Enhancement), который использует XHR, чтобы сделать запрос с произвольными заголовками (при условии, что URL-адрес соответствует одной и той же политике происхождения), а затем обработать результат в JS.
Мне нужны хитроумные хаки...
Это может помочь, если вы описали проблему, а не спросили, будут ли возможные решения работать.
Ответ 2
Если вы контролируете серверную сторону, возможно ли установить значение заголовка в строке запроса и отправить его так?
Таким образом, вы можете проанализировать его из строки запроса, если он не найден в заголовках.
Просто идея... И ты попросил хитроумный хак:)
Ответ 3
Как лучший автор написал с использованием XMLHttpResponse
за исключением 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
}
Ответ 4
Вы не можете напрямую добавить пользовательские заголовки с помощью window.open() во всплывающем окне, но для работы у нас есть два возможных решения
- Напишите метод Ajax для вызова этого конкретного URL с заголовками в отдельном файле HTML и используйте этот HTML в качестве URL в
<i>window.open()</i>
здесь - abc.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')
здесь политика CORS может блокировать запрос, если CORS не включен в запрошенном URL.
- Вы можете запросить URL-адрес, который запускает серверную программу, которая выполняет запрос с пользовательскими заголовками, а затем возвращает ответ, перенаправляющий на этот конкретный URL-адрес.
Предположим, что в сервлете Java (/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");
}
'
вызов сервлета в window.open('/requestURL')
Ответ 5
Похоже, что в течение 6 лет решение было доступно. Проверьте ответ, представленный здесь:
удаление ссылки, так как это не лучшее решение с точки зрения безопасности. Если вы хотите найти обходной путь, который помещает значения в качестве параметров поиска, переполнение стека поиска для: how-to-add-authentication-header-to-window-open