Создание заголовка при отправке запроса (request) и разбор при получении ответа
когда используется rest-технология, тогда на сервер отправляются запросы с помощью ajax-технологии, например вот так:
/* Запрос к странице, которая требует авторизацию * beforeSend - прежде чем отправить ajax-запрос, * формируем специальный заголовок и только тогда отправляем * запрос*/ function redirectUrlOld(uri, idToken){ var token = sessionStorage.getItem(idToken); $.ajax({ type: "POST", url: '/'+ uri, contentType: 'application/json', beforeSend : function(request) { request.setRequestHeader('Authorization', makeHeaderWithJwt(token)); }, success: function () { console.log("Успешно отправлен ответ!") }, error: function (error) { console.log("Ошибка перенаправления!") /*нужно определиться с селктором, где будет появляется * сообение об ошибке*/ // messageErr(error,selector); } }); } Здесь видно, что я могу установить заголовок, а на сервере "фильтры" анализируют этот заголовок. Заголовок нужен чтобы передавать token-безопасности. Но вопрос вот в чем. Когда пользователь прошел аутентификацию успешно и мне через ajax, был возвращен ответ с сформированным token, я сохраняю полученный token в sessionStorage или localStorage, и затем я передаю управление функции, которая делает запрос на сервер, чтобы получить другую страницу, другой ресурс (в этот момент не используется rest, а в моем случае используется сервлет, который обработав запрос, отдает на сторону клиента нужный ресурс (html-страница)) Перенаправление приосходит вот так: window.location.href = '/'+ uri Я пробовал передать idToken в параметре window.location.href = '/'+ uri + '?param=' +idToken; Я на сервере его получал и при формировании response, я мог там сформировать заголовок с полученным idToken и отдать обратно. 1. Я не хотел бы отправлять в качестве параметра Get-запроса, idToken. а хотел бы сформировать на стороне клиента заголовок с токеном. Но как это можно сделать вне вот такой функции $.ajax({ type: "POST", url: '/'+ uri, contentType: 'application/json', beforeSend : function(request) { request.setRequestHeader('Authorization', makeHeaderWithJwt(token)); }, success: function () { ..... 2. При формировании новой страницы и отправки response клиенту, я могу сформировать заголовок, но как на стороне клиента я мог бы получить данные заголовка? 3. Передача токена через глобальную переменную на стороне клиента ? Я этого как раз то и хочу избежать. Поэтому и думаю как это все передавать через заголовок. 4. Еще раз повторюсь : при использовании ajax и rest-технологии вопросов с передачей токена нет. Вопрос стоит в том, как его можно передавать в заголовке и затем разбирать на стороне клиента, если используется обычная классическая технология на сервлетах. 5. Cookies - не используются (плюсы и минусы прошу не обсуждать ) Может кто знает статью, которая доступно объяснит как формируется заголовок, когда запрашивается ресурс. Когда формируется response , тогда заголовок формируется сервером заново или использует заголовок пришедший в request? Я вот об этом ничего не знаю и хотел бы разобраться. |
вот нашел какое решение.
function redirectUrlOld(uri, idToken){ var token = sessionStorage.getItem(idToken); //window.location.href = '/'+ uri; var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest; var xhr = new XHR(); function reqReadyStateChange() { if (xhr.readyState == 4 && xhr.status == 200) document.getElementById("output").innerHTML=xhr.responseText; } var href = window.location.href + uri; xhr.open("GET", window.location.href = '/'+ uri); xhr.setRequestHeader('idToken', idToken); xhr.send(); Я в ответ получаю страницу с заголовком, который создал на стороне сервера. /**вывод таблицы *массивы arrTh и arrDataAttrName, должны быть одинаковой длины (одинаковое количество элементов) * *arrTh - массив для заголовков-столбцов * */ $(document).ready(function () { /*адрес endpoint of rest-controller*/ var urlToServer = 'api/employee/all'; var selectorNameOfTable = '.tableEmployees'; var selectorForTable = 'tableFirst'; $(selectorNameOfTable).createTablePlugin({ isUsedDataTables: true, nameTable: 'Сотрудники', /*заголовок таблицы*/ nameLevelAccessValue: 'administrator', /*название уровня доступа*/ .... У этой страницы, свой javascript, на основе которого создается наполнение текущей страницы, а как получить теперь нужный мне заголовок? |
$.ajax() и XMLHttpRequest это одно и тоже, просто первое это jquery-обертка. Что за сервлеты?
|
Цитата:
Вообщем то нужно теперь вытащить заголовок. Туда я его уже забрасываю, на сервере сервлет (класс который обрабатывает запрос) обрабатывает запрос, затем в response добавляю заголовок и отправляю клиенту. Видно что созданный заголовок приходит, но как его достать ? Может когда загружается документ, есть какая-то системная переменная, которую можно вызвать и вытащить нужный заголовок ? |
вот как оформляю отправление токена
function redirectUrlOld(uri, idToken){ var token = sessionStorage.getItem(idToken); //window.location.href = '/'+ uri; var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest; var xhr = new XHR(); /* function reqReadyStateChange() { if (xhr.readyState == 4 && xhr.status == 200) document.getElementById("output").innerHTML=xhr.responseText; } */ // var href = window.location.href + uri; - так не работает xhr.open("GET", window.location.href = '/'+ uri); xhr.setRequestHeader('idToken', idToken); xhr.send(); Я в ответ получаю страницу с нужным заголовком, который создал на стороне сервера. В этом заголовке передаю токен или idToken Вот страница, которая загружает запрашиваемый документ Код на этой странице в свою очередь отправляет ajax-запрос, чтобы получить данные для табилицы, так вот здесь нет проблем передать в заголовке токен, обработать его на сервере (там заголовок принимают фильтры безопасности ) /**вывод таблицы *массивы arrTh и arrDataAttrName, должны быть одинаковой длины (одинаковое количество элементов) * *arrTh - массив для заголовков-столбцов * */ $(document).ready(function () { /*адрес endpoint of rest-controller*/ var urlToServer = 'api/employee/all'; var selectorNameOfTable = '.tableEmployees'; var selectorForTable = 'tableFirst'; $(selectorNameOfTable).createTablePlugin({ isUsedDataTables: true, nameTable: 'Сотрудники', /*заголовок таблицы*/ nameLevelAccessValue: 'administrator', /*название уровня доступа*/ .... У этой страницы, свой javascript, на основе которого создается наполнение текущей страницы, а как получить теперь нужный мне заголовок? |
Никак, только через ajax можно получить заголовок xhr.getResponseHeader('headerName'). А это извращение xhr.open("GET", window.location.href = '/'+ uri) так не работает, здесь просто выполнится переход на window.location.href, что дальше в коде идет уже не важно.
|
Часовой пояс GMT +3, время: 02:59. |