7

403 forbidden每次尝试GET从数据库中获取用户信息时,我都会收到-error。关于我下面的代码,每次我通过按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>

用户控制器类:

    @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;
}
4

5 回答 5

27

它通常是由 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);
  });
});

请注意,我使用的是 thymeleaf,所以我使用 th:content 而不是 content 属性。

于 2015-11-19T17:46:21.687 回答
5

如果您使用的是 Spring Security 3.2R1 及更高版本,请尝试使用此解决方案 http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection

于 2013-12-03T09:59:58.073 回答
2

从 Spring Security 4.0 开始,默认情况下通过 XML 配置启用 CSRF 保护。如果您想禁用 CSRF 保护,可以在下面看到相应的 XML 配置。

<security:http use-expressions="true">
           ...
   <security:csrf disabled="true" />
</security:http>
于 2015-12-16T18:12:11.280 回答
1

检查文件权限。403 是服务器错误,而不是 Ajax。尝试直接检查请求的文件(通过文件我的意思是 url)。

于 2013-09-30T09:55:31.233 回答
0

Spring Rest或其他REST实现(如Jersey)中,如果服务器端没有匹配的资源,403 Forbidden则由 REST 容器抛出。

您需要重新验证请求响应注释。

例如,对于ajaxTest请求,请尝试以下更改:

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

基本上 person-id 看起来不像一个请求参数(我们在 中设置GET URL),尝试更改为PathVariable,如果您不确定默认方法 in Spring REST,明确定义HTTP-Method应该调用哪个方法。

在 上403,它意味着operation not allowed除了身份验证失败之外的许多类似原因。查看http://en.wikipedia.org/wiki/HTTP_403了解各种可能性。

于 2013-09-30T10:09:45.553 回答