[英]403 Forbidden Error with ajax GET request Spring
每次嘗試從數據庫中GET
用戶信息時,我都收到403 forbidden
錯誤。 關於下面的代碼,每次我嘗試通過按Ajax測試按鈕嘗試請求時,它都無法運行並發出警報,但在控制台中也顯示403 Forbidden
-error。 我不確定是否與Spring安全性有關?
用戶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;
}
它通常是由Spring默認的CSRF保護引起的。
例如,如果您使用JS代碼中的DELETE HTTP請求,則還需要發送CSRF保護標頭。
無需禁用CSRF保護! 請不要這樣做,如果沒有必要。
您可以通過以下方式輕松添加CSRF AJAX / REST保護:
1.向每個頁面添加元標題(使用@ layout.html等):
<head>
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>
</head>
2.自定義您的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);
});
});
請注意,我使用百里香葉,所以我使用th:content而不是content屬性。
如果您使用的是Spring Security 3.2R1及更高版本,請嘗試使用此解決方案http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection
從Spring Security 4.0開始,默認情況下使用XML配置啟用CSRF保護。 如果要禁用CSRF保護,則可以在下面看到相應的XML配置。
<security:http use-expressions="true">
...
<security:csrf disabled="true" />
</security:http>
檢查文件權限。 403是服務器錯誤,而不是Ajax。 嘗試直接檢查請求的文件(按文件,我是指url)。
在Spring Rest
或其他REST
實現中(例如Jersey
),如果服務器端沒有匹配的資源,則REST容器會拋出403 Forbidden
。
您需要重新驗證req-response批注。
例如,對於ajaxTest
請求,請嘗試以下更改:
@RequestMapping("/ajaxTest/{personid}", method=RequestMethod.GET)
@ResponseBody
public User ajaxTest(@PathVariable Integer personid) { .. }
基本上,person-id看起來不像是一個請求參數(我們在GET
URL
設置),請嘗試將其更改為PathVariable
,如果不確定Spring REST
默認方法,請顯式定義此方法應獲取的HTTP-Method
調用。
在403
,它表示除身份驗證失敗外, operation not allowed
任何operation not allowed
或許多類似原因。 看看http://en.wikipedia.org/wiki/HTTP_403了解各種可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.