2016-01-12 76 views
4

我正在使用與CSRF春季安全和我有一個POST調用在我的JavaScript的問題。對於我的頁面,我使用Thymeleaf和HTML 5,其餘調用我的控制器我使用jQuery.ajax。 如果我這樣使用Ajax調用我的形式:春季CSRF與ajax休息電話和HTML頁與Thymeleaf使用

$(function() { 
    $("#saveCarButton").click(
      function() { 
       var form = $("#addCarForm");   
       $.ajax({ 
        type : "POST", 
        url : form.attr("action"), 
        data : form.serialize(), 
        // all right with rest call 
        success : function(data) {...} 
        //error during rest call 
        error : function(data) { 
         window.location.href = "/500"; 
        } 
       }); 
      }); 
}); 

一切正常,但是當我打電話例如這個函數:

jQuery.ajax({ 
     url : 'upload', 
     type: 'POST', 
     contentType: false, 
     processData: false, 
     data:formData, 
     beforeSend:function(xhr) { 
      waitingModal.showPleaseWait(); 
     }, 
     success: function(data,status,xhr){...} 
     error: function(xhr,status,e){ 
     } 
    }).complete(function() { 
     //add timeout because otherwise user could see a too fast waiting modal 
     setTimeout(function(){ 
      waitingModal.hidePleaseWait(); 
     }, 1000); 
    }); 

我收到錯誤403 也許與形式,使用thymeleaf,它工作正常,但第二種類型的請求我必須添加CSRF令牌。 我試着用

var token = $("meta[name='_csrf']").attr("content"); 
var header = $("meta[name='_csrf_header']").attr("content"); 

,在我的html頁面,我添加

!-- --> 
<meta name="_csrf" th:content="${_csrf.token}"/> 
<!-- default header name is X-CSRF-TOKEN --> 
<meta name="_csrf_header" th:content="${_csrf.headerName}"/> 

爲什麼與形式的工作不是嗎? 當我使用表單時,我不需要添加任何內容? 使用瀏覽器的開發工具可以看到_csrf和_csrf_header是否有危險? 感謝

回答

3

這是最有可能是由於沒有CSRF令牌正在通過因此403

這送來的事實是,確實爲這些事情(至少對我來說)的伎倆修復。

var token = $("meta[name='_csrf']").attr("content"); 
var header = $("meta[name='_csrf_header']").attr("content"); 
$(document).ajaxSend(function(e,xhr,options) { 
    xhr.setRequestHeader(header, token); 
} 

總之,它將CSRF標記附加到您通過ajax執行的任何請求。

1

該解決方案爲我Trying to use React/Ajax calls with Spring MVC and Thymeleaf

<meta id="_csrf" name="_csrf" th:content="${_csrf.token}"/> 
<meta id="_csrf_header" name="_csrf_header" th:content="${_csrf.headerName}"/> 

阿賈克斯:

var token = $('#_csrf').attr('content'); 
var header = $('#_csrf_header').attr('content'); 

$.ajax({ 
         type: "POST", 
         url: url, 
         beforeSend: function(xhr) { 
          xhr.setRequestHeader(header, token); 
         }, 

         success: function(data, textStatus, jqXHR) { 
          alert(status); 
         }, 
         error: function(request, status, error) { 
          alert(status); 
         } 
        });