JQuery Ajax Firefox не отправляет cookie (работает Chrome)

Я пытаюсь использовать аутентификацию Ajax в своем приложении, и я, похоже, получил его работу, за исключением firefox, похоже, не отправляет правильный jessionid на сервер в заголовке запроса "cookie" для последующих запросов, тогда как chrome делает это просто отлично. Вот функция входа в систему:

$.ajaxSetup({
    xhrFields: {
        withCredentials : true
    }
})
function sudoLogin(callback){

    $.ajax({
            url : HOST + "/ProperApp/j_spring_security_check",
            type : "POST",
            data : $("#login").serialize(),
            dataType: 'json',
            async : false,
            success: function(result) {
                if (result.login) {
                    callback(true);
                } else {
                    callback(false);
                }
            }
        })
}

в ответе в firefox я вижу, что cookie устанавливается, и обратный вызов успеха называется:

Set-Cookie  JSESSIONID=81235e7ff741e941c1e078afee5c; Path=/ProperApp; HttpOnly

однако, в последующих запросах, таких, как этот, cookie не отправляются:

function getUserDeets(callback){
    $.ajax({
        url : HOST+ "/ProperApp/userData",
        type : "GET",
        async : false,
        dataType : 'json',
        xhrFields: {
                withCredentials: true
            },
        success : function(data){
            callback(data);
        }
    })
}
$('#submitLogin').click(function(){
            sudoLogin(function(loggedIn){
                if(loggedIn){
                    //window.location = "sudoIndex2.php";
                    getUserDeets(function(user){
                       alert(user);
                    })

                }
                else
                    alert("login failure");
            });
        });

в Chromium запрос содержит заголовок cookie, и обратный вызов успеха вызывается правильно:

...
Connection:keep-alive
Cookie:JSESSIONID=8129ef67b59180f9f21383cba850
Host:localhost:8080
Origin:http://localhost:8000
Referer:http://localhost:8000/loginSignup.php
...

однако в Firefox заголовок запроса не содержит заголовок cookie, и успех никогда не вызывается:

...
Connection  keep-alive
Host    localhost:8080
Origin  http://localhost:8000
Referer http://localhost:8000/loginSignup.php
...

Ive создал фильтр ajax на стороне сервера, который, я думаю, должен позволить этому произойти:

response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
response.setHeader("Access-Control-Max-Age", "360");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "Authorization");

любая идея, почему это будет работать в Chrome, но не В Firefox?

2 ответов


Если вы хотите использовать собственный ajax или jQuery ajax, то снимите async: false. у меня получилось.

для дальнейшей совместимости в старых браузерах я рекомендую использовать http://easyxdm.net/wp/. Подход EasyXDM заключается в использовании взлома iframe, который требует размещения html-файла на хосте, к которому вы делаете вызовы ajax. И это будет сильно асинхронно, да. Но что приятно с этим easyXDM, так это то, что вам не придется беспокоиться о заголовках cors.


сначала несколько наблюдений:

  • OP (original post) имел дело с междоменным XHR, потому что AustinR использовал разные порты (если какая-либо часть хоста, домена или порта отличается, то браузер рассматривает XHR как междоменный)
  • Кросс-домен XHRs должны быть установлены правильные заголовки CORS на сервере
  • javascript в OP казался прекрасным, за исключением async: false, который в идеале должен быть установлен в async:true (или пропущен, потому что настройка по умолчанию true)

ссылаясь на данный пример, я бы начал со следующих заголовков CORS:

response.setHeader("Access-Control-Allow-Origin", "http://localhost:8000"); // use a wildcard (*) as the 2nd parameter if you want to be less restrictive
response.setHeader("Access-Control-Max-Age", "360");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET");
response.setHeader("Access-Control-Allow-Headers", "Origin");
response.setHeader("Access-Control-Expose-Headers","Access-Control-Allow-Origin");

последний параметр CORS "Access-Control-Expose-Headers" особенно полезен, потому что он дает вам возможность устранить неполадки заголовков, которые отправляются в HTTP-ответе сервером.

проверьте раздел заголовка ответа на панели Firebug network для заголовков CORS. Заголовок" Origin " вашего запроса должен соответствовать шаблону заголовка" Access-Control-Allow-Origin " ответа сервера.