2015-01-08 21 views
5

Ho un problema nella mia app di avvio di primavera con il token csrf.Spring Security CSRF Token non funziona con AJAX

Ho un modulo in cui posso modificare una persona. Una persona può avere

Immaginiamo ora che la persona abbia una macchina e inserisca questa e la memorizzi. La prossima volta che vorrà cancellare questa macchina e inserirne un'altra. L'ho creato in modo che ci sia una lista di tutte le sue macchine - ha la possibilità di rimuoverlo dalla lista. Ora sto iniziando da queste pillole e voglio inviare con l'ID corrispondente al server un POST. Quando cerco di ottenere un 403 proibito e non ho idea del perché.

Se cambio da POST a GET, funziona.

mio JavaScript (tratto da questo sito: http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags-tag)

var csrfParameter = $("meta[name='_csrf_parameter']").attr("content"); 
var csrfHeader = $("meta[name='_csrf_header']").attr("content"); 
var csrfToken = $("meta[name='_csrf']").attr("content"); 

// using JQuery to send a non-x-www-form-urlencoded request 
var headers = {}; 
headers[csrfHeader] = csrfToken; 
$.ajax({ 
    url: "./delete/car", 
    type: "GET", 
    headers: headers, 
}); 

$.ajax({ 
    url: "./delete/car", 
    type: "POST", 
    headers: headers, 
}); 

I miei metodi di controller:

@RequestMapping(value = "/{login}/delete/car", method = RequestMethod.GET) 
    public ModelAndView delete(@PathVariable("login") final String login) { 
     System.out.println("Stop"); 
     return new ModelAndView("redirect:" + WebSecurityConfig.URL_PERSONS_OVERVIEW); 
    } 

    @RequestMapping(value = "/{login}/delete/car", method = RequestMethod.POST) 
    public ModelAndView deleteInstEmp(@PathVariable("login") final String login) { 
     System.out.println("Stop"); 
     return new ModelAndView("redirect:" + WebSecurityConfig.URL_PERSONS_OVERVIEW); 
    } 

qualche suggerimento?

Grazie in anticipo.

+0

' "/ {login}/cancellare/car", method = RequestMethod.GET' questo ascoltare richieste GET non post –

+0

dispiace, copia incolla errore dal mio sito. nel mio ide è giusto –

risposta

13

OK, dopo aver lottato con tutto questo, ottengo il seguente risultato.

ho aggiunto il metodo fail al Ajax costruire e ottenere il seguente messaggio:

"Impossibile eseguire 'setRequestHeader' on 'XMLHttpRequest': '$ {_ csrf.headerName}' non è un HTTP valida nome del campo di intestazione. "

il sito ufficiale primavera consiglia che bisogna mettere questo: <sec:csrfMetaTags /> o da altre fonti, in questo modo: <meta name="_csrf" th:content="${_csrf.token}"/> nel file HTML.

Dopo questo, dovresti essere in grado di accedere a questi attributi nel tuo JavaScript, ma nel mio caso ottengo undefined e ${_csrf.headerName}.

Un ultimo tentativo è stato quello di prendere il valore dal valore nascosto (capitolo 24.5: http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags-tag).

ora, ho il seguente:

$(function() { 
    var token = $("input[name='_csrf']").val(); 
    var header = "X-CSRF-TOKEN"; 
    $(document).ajaxSend(function(e, xhr, options) { 
     xhr.setRequestHeader(header, token); 
    }); 
}); 

$.ajax({ 
    url: "./delete/car", 
    type: "POST", 
    success:function(response) { 
     alert(response); 
    } 
}); 

Con questo funziona come un fascino.

+0

perfetto !! Stavo persino vagando su come farlo. Funziona. grazie! – Sizzler

0

Un altro modo, è possibile utilizzare il seguente codice:

$.ajax({ 
    url : './delete/car', 
    headers: {"X-CSRF-TOKEN": $("input[name='_csrf']").val()}, 
    type : 'POST', 
    success : function(result) { 
     alert(result.msgDetail); 
    } 
}) 
Problemi correlati