2015-01-08 10 views
5

У меня проблема с моим загрузочным приложением с токеном csrf.Spring Security CSRF Token не работает с AJAX

У меня есть форма, где я могу редактировать Личность. Лицо может иметь

Теперь представим себе, что у человека есть автомобиль и введите его и сохраните. В следующий раз он захочет удалить этот автомобиль и ввести еще один. Я создал это так, что есть список всех его автомобилей - у него есть возможность удалить это из списка. Теперь я начинаю с этих таблеток и хочу отправить с соответствующим ID на сервер POST. Когда я пытаюсь, я получаю запрет на 403, и я понятия не имею, почему.

Если я перехожу от POST к GET, тогда он работает.

My JavaScript (взято с этого сайта: 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, 
}); 

Мои методы контроллера:

@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); 
    } 

Любые предложения?

Заранее спасибо.

+0

' "/ {} Логин/удаление/автомобиль", метод = RequestMethod.GET' это слушать GET запросы не POST –

+0

извините, копировать пасты ошибка с моего сайта. в моей идее правильно –

ответ

13

ОК, после битвы со всем этим, я получаю следующий результат.

Я добавил fail метод Аякса построить и получить следующее сообщение:

«Не удалось выполнить„setRequestHeader“на„XMLHttpRequest“:„$ {_ csrf.headerName}“не является допустимым HTTP имя поля заголовка. "

официальный сайт весной сообщает, что вы должны поставить это: <sec:csrfMetaTags /> или из других источников, это: <meta name="_csrf" th:content="${_csrf.token}"/> в вашем HTML файле.

После этого вы должны иметь доступ к этим атрибутам в своем JavaScript, но в моем случае я получаю undefined и ${_csrf.headerName}.

Последняя попытка состояла в том, чтобы извлечь значение из скрытого значения (глава 24.5: http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags-tag).

Теперь у меня есть следующие:

$(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); 
    } 
}); 

С этим он работает как шарм.

+0

безупречно !! Я даже блуждал, как переложить это. Оно работает. спасибо! – Sizzler

0

Другой способ, вы можете использовать следующий код:

$.ajax({ 
    url : './delete/car', 
    headers: {"X-CSRF-TOKEN": $("input[name='_csrf']").val()}, 
    type : 'POST', 
    success : function(result) { 
     alert(result.msgDetail); 
    } 
}) 
Смежные вопросы