Ursprungsübergreifende gemeinsame Nutzung von Ressourcen mit Spring Security

Ich versuche CORS dazu zu bringen, gut mit Spring Security zu spielen, aber es ist nicht konform. Ich habe die in beschriebenen Änderungen vorgenommenDieser Beitrag und Ändern dieser Zeile inapplicationContext-security.xml POST- und GET-Anforderungen funktionieren für meine App (macht vorübergehend Controller-Methoden verfügbar, damit ich CORS testen kann):

Vor:<intercept-url pattern="/**" access="isAuthenticated()" />Nach dem:<intercept-url pattern="/**" access="permitAll" />

Leider reagiert die folgende URL, die Anmeldungen von Spring Security über AJAX ermöglicht, nicht:http://localhost:8080/mutopia-server/resources/j_spring_security_check. Ich mache die AJAX-Anfrage vonhttp://localhost:80 zuhttp://localhost:8080.

In Chrome

Beim Versuch zuzugreifenj_spring_security_check Ich bekomme(pending) in Chrome für die OPTIONS-Preflight-Anforderung und den AJAX-Aufruf werden mit dem HTTP-Statuscode 0 und der Meldung "Fehler" zurückgegeben.

In Firefox

Der Preflight ist mit dem HTTP-Statuscode 302 erfolgreich und ich erhalte direkt danach den Fehler-Rückruf für meine AJAX-Anforderung mit dem HTTP-Status 0 und der Meldung "Fehler".

AJAX-Anforderungscode
function get(url, json) {
    var args = {
        type: 'GET',
        url: url,
        // async: false,
        // crossDomain: true,
        xhrFields: {
            withCredentials: false
        },
        success: function(response) {
            console.debug(url, response);
        },
        error: function(xhr) {
            console.error(url, xhr.status, xhr.statusText);
        }
    };
    if (json) {
        args.contentType = 'application/json'
    }
    $.ajax(args);
}

function post(url, json, data, dataEncode) {
    var args = {
        type: 'POST',
        url: url,
        // async: false,
        crossDomain: true,
        xhrFields: {
            withCredentials: false
        },
        beforeSend: function(xhr){
            // This is always added by default
            // Ignoring this prevents preflight - but expects browser to follow 302 location change
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.setRequestHeader("X-Ajax-call", "true");
        },
        success: function(data, textStatus, xhr) {
            // var location = xhr.getResponseHeader('Location');
            console.error('success', url, xhr.getAllResponseHeaders());
        },
        error: function(xhr) {
            console.error(url, xhr.status, xhr.statusText);
            console.error('fail', url, xhr.getAllResponseHeaders());
        }
    }
    if (json) {
        args.contentType = 'application/json'
    }
    if (typeof data != 'undefined') {
        // Send JSON raw in the body
        args.data = dataEncode ? JSON.stringify(data) : data;
    }
    console.debug('args', args);
    $.ajax(args);
}

var loginJSON = {"j_username": "username", "j_password": "password"};

// Fails
post('http://localhost:8080/mutopia-server/resources/j_spring_security_check', false, loginJSON, false);

// Works
post('http://localhost/mutopia-server/resources/j_spring_security_check', false, loginJSON, false);

// Works
get('http://localhost:8080/mutopia-server/landuses?projectId=6', true);

// Works
post('http://localhost:8080/mutopia-server/params', true, {
    "name": "testing",
    "local": false,
    "generated": false,
    "project": 6
}, true);

Bitte beachten Sie, dass ich über CORS auf jede andere URL in meiner App POSTEN kann, mit Ausnahme der Anmeldung bei Spring Security. Ich habe viele Artikel durchgesehen, daher wäre jeder Einblick in dieses seltsame Thema sehr dankbar

Antworten auf die Frage(8)

Ihre Antwort auf die Frage