403 forbidden每当我尝试GET从数据库中获取用户信息时,都会收到-error 消息。关于下面的代码,每当我尝试通过按Ajax测试按钮尝试请求时,它都无法运行并给我发出警报,但是在控制台中也给我一个403 Forbidden-error。我不确定是否与Spring安全性有关?
403 forbidden
GET
403 Forbidden
用户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属性。