簡體   English   中英

ajax GET請求出現403禁止錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM