403 ajax GET请求Spring的禁止错误
每次我尝试从数据库中GET
用户的信息时,我都会收到403 forbidden
错误。 关于我的下面的代码,每次我按下Ajax测试按钮尝试请求时,它都无法运行并给我一个警报,但在控制台中也给了我一个403 Forbidden
-error。 我不确定它是否与Spring安全性有关?
用户JSP页面:
User Id Full Name Username Email Date of Birth User Authority Update Delete <a id="update" href="https://stackoverflow.com/questions/19091206/403-forbidden-error-with-ajax-get-request-spring/"> <a id="delete" href="https://stackoverflow.com/questions/19091206/403-forbidden-error-with-ajax-get-request-spring/">
$(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'); }); }); });
用户控制器类:
@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或其他内容):
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配置。
...
检查文件权限。 403是服务器错误,而不是Ajax。 尝试直接检查请求的文件(通过文件我的意思是url)。
在Spring Rest
或其他REST
实现(如Jersey
)中,如果服务器端没有匹配的资源,则REST容器会抛出403 Forbidden
。
您需要重新validationreq-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
,它意味着除了auth故障之外operation not allowed
或许多类似的原因。 请查看http://en.wikipedia.org/wiki/HTTP_403了解各种可能性。