java - ajax GET请求Spring的403禁止错误

标签 java jquery ajax spring spring-mvc

每次尝试从数据库中GET 用户信息时,我都会收到403 forbidden 错误。关于我下面的代码,每次我通过按下 Ajax 测试 按钮尝试请求时,它都无法运行并给我一个警报,但也在控制台中给我一个 403 Forbidden-错误。不知道是不是跟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>

用户 Controller 类:

    @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 保护 header 。

没有必要禁用 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 请求以针对每个请求发送这些 header :

$(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,所以我使用 th:content 而不是 content 属性。

关于java - ajax GET请求Spring的403禁止错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19091206/

相关文章:

java - @RequestBody 是否应该在 Spring Webflux 中用 Mono Publisher 包装?

javascript - 在 Bootstrap 下拉元素上使用 intro.js

php - jQuery AJAX 使用 fadeIn 加载内容

java - 使用 OwlApi 从带有标签的 owl 文件中提取子类

java - java.nio.file.CopyOption 接口(interface)的目标是什么?

java - 如何确定通过Input/ActionMap绑定(bind)导致AbstractAction被触发的Key?

javascript - 我如何自定义此 Canvas 的设计?

javascript - 消失的形式命中?

javascript - 在ajaxes完成之前阻止提交

javascript - CakePHP REST API 为 AJAX 提供 403 但不为 cURL