2013-09-30 94 views
4

我得到一個403 forbidden -error每次Forbidden錯誤我嘗試GET用戶的數據庫中的信息。與下面我的代碼,我每次按阿賈克斯測試按鈕嘗試請求時,它無法運行,並給了我一個警告,而且在控制檯給我一個403 Forbidden - 錯誤。我不確定它是否與Spring安全有關?403使用Ajax GET請求春天

用戶JSP頁面:

<table> 
    <tr> 
     <td>User Id</td> 
     <td>Full Name</td> 
     <td>Username</td> 
     <td>Email</td> 
     <td>Date of Birth</td> 
     <td>User Authority</td> 
     <td>Update </td> 
     <td>Delete</td> 
    </tr> 
    <c:forEach var="user" items="${users}"> 
     <tr> 
      <td><c:out value="${user.id}" /></td> 
      <td><c:out value="${user.name}"/></td> 
      <td><c:out value="${user.username}"/></td> 
      <td><c:out value="${user.email}"/></td> 
      <td><c:out value="${user.dob}"/></td> 
      <td><c:out value="${user.authority}"/></td> 
      <td> 
       <a id="update" href="<c:url value="/viewUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Update</button></a> 
      </td> 
      <td> 
       <a id="delete" href="<c:url value="/deleteUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Delete</button></a> 
      </td> 
      <td> 
       <button class="loadUser" name="id" value="${user.id}">Ajax test</button> 
      </td> 
     </tr> 
    </c:forEach> 
</table> 
<div id="personIdResponse"> </div> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     $(".loadUser").click(function(e) { 
      e.preventDefault(); 
      var personId = +$(this).val(); 
      $.get('${pageContext.request.contextPath}/SDP/ajaxTest/' + personId, function(user) { 
        $('#personIdResponse').text(user.name + ', = username ' + user.username); 
       }) 
      .fail(function(user){ 
       alert('Could not load user'); 
      }); 
     }); 
    }); 
</script> 

用戶控制器類:

@RequestMapping("/viewUser") 
public String updateUser(Model model, @RequestParam(value = "id", required = false) Integer id) { 

    User user = usersService.getUser(id); 

    model.addAttribute("user", user); 

    return "settings"; 
} 

@RequestMapping("/ajaxTest") 
@ResponseBody 
public User ajaxTest(@RequestParam(value = "id", required = false) Integer id) { 

    User user = usersService.getUser(id); 
    return user; 
} 
+0

這樣http://stackoverflow.com/questions/11185285/ajax-jquery-call-getting-networkerror-403-forbidden-error-in-response – Sitansu

+0

我將如何實現這個JSONP與我現有的碼? – Maff

+0

如果請求被破壞或存在跨域問題,則可能會出現403禁用錯誤。請檢查您的請求。 –

回答

1

檢查文件的權限。 403是服務器錯誤,而不是Ajax。嘗試直接檢查請求的文件(通過文件我的意思是網址)。

0

Spring Rest或其它REST實現(像Jersey)如果在服務器側不匹配資源然後403 Forbidden通過REST容器拋出。

您需要重新驗證REQ響應的註釋。

例如,對於ajaxTest請求嘗試這種變化:

@RequestMapping("/ajaxTest/{personid}", method=RequestMethod.GET) 
@ResponseBody 
public User ajaxTest(@PathVariable Integer personid) { .. } 

基本上人-ID看起來並不像一個請求參數(這是我們在GETURL設置),嘗試改變對PathVariable,如果你不確定Spring REST中的默認方法,明確定義該方法應該被調用的哪個HTTP-Method

403上,暗示operation not allowed或許多類似的原因,除了auth失敗。看看http://en.wikipedia.org/wiki/HTTP_403各種可能性。

+0

我只是試圖實現這一點,但我得到了完全相同的問題。 – Maff

+0

@RequestMapping(值= 「/ ajaxTest/{PERSONID}」,方法= RequestMethod.GET) \t @ResponseBody \t公共用戶ajaxTest(@PathVariable整數PERSONID){ \t \t \t 用戶\t用戶= usersService.getUser( PERSONID); \t \t返回用戶; \t} 也就是說在控制器我更新的代碼。 – Maff

+0

你可以發佈你的'rest-servlet.xml'嗎?看起來像'@ ResponseBody'你期待'json'轉換,你在classpath中有'jackson' jar嗎?不知道這是''403'爲'Spring REST'的情況,但更好的檢查.. – harsh

19

它通常是由春默認CSRF保護造成的。

如果使用例如從您的JS代碼DELETE HTTP請求,要求也送CSRF保護頭部。

這是沒有必要禁用CSRF保護!請不要這樣做,如果沒有必要。

您可以輕鬆地添加AJAX CSRF/REST保護方式:

1.Adding元頭的每一個頁面(使用@的layout.html或東西):

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

2.Customizing您AJAX請求發送這些報頭的每個請求:

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

注意,我使用thymeleaf,所以我使用J:內容,而不是內容屬性的。

+0

。沒有文字。感謝您的幫助 – Raghu

+0

什麼是_csrf.headerName? –

+0

@H。鄭開始嘗試使用X-CSRF-TOKEN –

2

因爲Spring Security 4。0,默認情況下使用XML配置啓用CSRF保護。如果您想禁用CSRF保護,則可以在下面看到相應的XML配置。

<security:http use-expressions="true"> 
      ... 
    <security:csrf disabled="true" /> 
</security:http>