cookie не сохраняется в браузере, даже если ответ содержит заголовок «Set-Cookie» для запроса ajax - PullRequest
0 голосов
/ 06 июня 2018

cookie не сохраняется в браузере, даже если ответ содержит заголовок «Set-Cookie» для запроса ajax.

Код запроса:

function hitLogin(){
        var loginUrl = "http://myapp:8080/login";

        var geturl;
        $.ajax({

            type: "GET",
            url : loginUrl,
            data:   {
            user : "user1",
            password : "encryptedPassword"              
            },              
            headers: {
                "credentials": 'include',
                "withCredentials" : true,
                "crossDomain": true,
                "X-Requested-With" : "XMLHttpRequest",
                "Content-type" : "application/x-www-form-urlencoded",
                "Accept":"text/plain",
            },              

            success : function(data)
            {                   
                alert("Ajax request data: "+data);
            },
            error: function( xhr, status, error ) 
            {
                alert("Ajax request error: "+status ); 
            }
        }); 
        }

Получены заголовки ответа:

Access-Control-Allow-Credentials: true

Access-Control-Allow-Headers: X-Requested-With, принять, тип содержимого, Cookie

Access-Control-AllowМетоды: POST, GET, PUT, OPTIONS, DELETE

Контроль доступа-Разрешить происхождение: http://myapp2.com:7011

Контроль доступа-Макс. Возраст: 3600

Кодировка содержимого: gzip

Тип содержимого: текстовый / обычный; кодировка = ISO-8859-1

Дата: среда, 06 июня 2018 15:10:09 GMT

Сервер: Apache-Coyote / 1.1

Набор-Cookie: MYCOOKIE = 62lml5_S7qS31KaFDg-SH-e8Ds5FPjljCIHzfmhxMAr8Fdrqr6fHLjI7s2XPAO2P3tNFLNLSfF 1F1F1F1F1FFPath = /;HttpOnly

Transfer-Encoding: chunked

Варьируется: Accept-Encoding

withCredentials: true

Я вижу файл cookie, сохраненный в браузере, когдатот же URL-адрес, полученный от браузера, но в случае запроса ajax, он не сохраняется.Следовательно, невозможно отправить последующие запросы, за исключением этого файла cookie.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Как уже упоминалось, это был случай CORS, и, следовательно, запрос jquery не смог установить cookie.

Установить Cookie в браузере с запросом Ajax через CORS

Помогнайти причину и смог сохранить cookie с XMLHttpRequest с withCredentials , установленным на true

0 голосов
/ 06 июня 2018

Вы отправляете withCredentials: true в качестве заголовка HTTP, который ничего не дает.Вместо этого вы должны установить его как XHR поле .В jQuery вы можете сделать это следующим образом:

$.ajax({
    type: "GET",
    url: loginUrl,
    data: { /* request parameters here */ },
    headers: { /* custom HTTP headers here, if you need any */ },
    xhrFields: {
        withCredentials: true,
    },
    /* other AJAX settings here */
})

Кроме того, все остальные настраиваемые HTTP-заголовки, которые вы отправляете, на самом деле тоже бесполезны:

  • credentials: include не является ни действительным заголовком HTTP, ни полем XHR, ни параметром jQuery AJAX .Вместо этого он выглядит как Fetch API , эквивалентный jQuery withCredentials: true.В любом случае, здесь это бесполезно.

  • crossDomain также не является заголовком HTTP.Его можно использовать в качестве параметра jQuery AJAX (т. Е. за пределами объекта headers), чтобы заставить jQuery обрабатывать запрос как междоменный, даже если целевой URL-адрес совпадает сдомен текущей страницы.В вашем случае это также бесполезно.

  • HTTP-заголовок X-Requested-With: XMLHttpRequest автоматически добавляется jQuery, поэтому указание его в качестве настраиваемого заголовка на 100% избыточно.

  • Нет необходимости явно отправлять заголовок HTTP Content-Type, так как jQuery автоматически сгенерирует его.Если вы хотите указать, какой тип контента должен использовать jQuery для запроса, вы должны сделать это с помощью параметра contentType 1038 * за пределами headers.В любом случае, тот, который вы указали, используется по умолчанию.

  • Аналогично, вместо отправки настраиваемого заголовка HTTP Accepts, вы должны использовать настройки jQuery $.ajax() accepts и / или dataType для управления типами контента, которые jQuery будет принимать в ответе.И, как правило, в этом нет необходимости, поскольку стандартные значения, используемые jQuery, хороши, если только ваш сервер не настроен неправильно и не отправляет неверный тип контента.

...