Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.04.2019, 10:24
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

Создание заголовка при отправке запроса (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?

Я вот об этом ничего не знаю и хотел бы разобраться.
Ответить с цитированием
  #2 (permalink)  
Старый 21.04.2019, 13:12
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

вот нашел какое решение.

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, на основе которого создается наполнение текущей страницы, а как
получить теперь нужный мне заголовок?
Ответить с цитированием
  #3 (permalink)  
Старый 21.04.2019, 13:28
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,129

$.ajax() и XMLHttpRequest это одно и тоже, просто первое это jquery-обертка. Что за сервлеты?

Последний раз редактировалось Rise, 21.04.2019 в 13:30.
Ответить с цитированием
  #4 (permalink)  
Старый 21.04.2019, 18:11
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

Цитата:
за сервлеты?
На J2EE (Java-платформа)

Вообщем то нужно теперь вытащить заголовок.
Туда я его уже забрасываю, на сервере сервлет (класс который обрабатывает запрос) обрабатывает запрос, затем в response добавляю заголовок и отправляю клиенту.
Видно что созданный заголовок приходит, но как его достать ?

Может когда загружается документ, есть какая-то системная переменная, которую можно вызвать и вытащить нужный заголовок ?

Последний раз редактировалось alex-romanov, 21.04.2019 в 18:15.
Ответить с цитированием
  #5 (permalink)  
Старый 21.04.2019, 18:13
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

вот как оформляю отправление токена

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, на основе которого создается наполнение текущей страницы, а как
получить теперь нужный мне заголовок?

Последний раз редактировалось alex-romanov, 21.04.2019 в 18:18.
Ответить с цитированием
  #6 (permalink)  
Старый 21.04.2019, 18:51
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,129

Никак, только через ajax можно получить заголовок xhr.getResponseHeader('headerName'). А это извращение xhr.open("GET", window.location.href = '/'+ uri) так не работает, здесь просто выполнится переход на window.location.href, что дальше в коде идет уже не важно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При отправке запроса pending serrrgggeee AJAX и COMET 0 02.07.2018 10:15
Снятие затемнения с экрана при получении ответа от php срипта с помощью setInterval roma86 jQuery 0 16.08.2009 11:39