Создание заголовка при отправке запроса (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, на основе которого создается наполнение текущей страницы, а как получить теперь нужный мне заголовок? |
Цитата:
Вообщем то нужно теперь вытащить заголовок. Туда я его уже забрасываю, на сервере сервлет (класс который обрабатывает запрос) обрабатывает запрос, затем в 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, на основе которого создается наполнение текущей страницы, а как получить теперь нужный мне заголовок? |
| Часовой пояс GMT +3, время: 20:42. |