Java 403 ajax GET请求Spring出现禁止的错误

Java 403 ajax GET请求Spring出现禁止的错误,java,jquery,ajax,spring,spring-mvc,Java,Jquery,Ajax,Spring,Spring Mvc,每次尝试从数据库中获取用户信息时,我都会收到一个403禁止-错误。关于我下面的代码,每次我通过按下Ajax Test按钮尝试请求时,它都无法运行并向我发出警报,但在控制台中也会向我发出403禁止-错误。我不确定这是否与Spring security有关 用户JSP页面: <table> <tr> <td>User Id</td> <td>Full Name</td> &

每次尝试从数据库中获取用户信息时,我都会收到一个
403禁止
-错误。关于我下面的代码,每次我通过按下Ajax Test按钮尝试请求时,它都无法运行并向我发出警报,但在控制台中也会向我发出
403禁止
-错误。我不确定这是否与Spring security有关

用户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>

检查文件权限。403是服务器错误,不是Ajax。尝试直接检查请求的文件(我指的是url文件)。
Spring Rest
或其他
Rest
实现(如
Jersey
)中的如果服务器端没有匹配的资源,则Rest容器会抛出
403禁止的

您需要重新验证req响应注释

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

@RequestMapping("/ajaxTest/{personid}", method=RequestMethod.GET)
@ResponseBody
public User ajaxTest(@PathVariable Integer personid) { .. }
基本上,person id看起来不像一个请求参数(我们在
GET
URL
中设置了该参数),请尝试更改为
PathVariable
,如果您不确定
Spring REST
中的默认方法,请显式定义应该调用该方法的
HTTP方法


403
上,它意味着不允许
操作
或除身份验证失败之外的许多类似原因。查看各种可能性。

如果您使用的是Spring Security 3.2R1及以上版本,请尝试使用此解决方案。

这通常是由Spring默认CSRF保护引起的

例如,如果您使用从JS代码中删除HTTP请求,则还需要发送CSRF保护头

无需禁用CSRF保护!如果没有必要,请不要这样做

您可以通过以下方式轻松添加CSRF AJAX/REST保护:

    @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;
}
1.向每个页面添加元标题(使用@layout.html或其他内容):


请注意,我使用了thymeleaf,因此我使用th:content而不是content属性。

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

<security:http use-expressions="true">
           ...
   <security:csrf disabled="true" />
</security:http>

...

像这样,我如何用我已有的代码实现这个JSONP?403如果请求被破坏或存在严重的跨域问题,可能会出现禁止的错误。请检查您的请求。我刚刚尝试实现此功能,但遇到了完全相同的问题。@RequestMapping(value=“/ajaxTest/{personId}”,method=RequestMethod.GET)@responseBy公共用户ajaxTest(@PathVariable Integer personId){User User User User=usersService.getUser(personId);return User;}这是我在控制器中的更新代码。你能同时发布你的
rest servlet.xml
吗?看起来像是通过
@ResponseBody
您正在期待
json
转换,您在类路径中有
jackson
jar吗?不确定
403
对于
Spring REST
是否会出现这种情况,但最好检查一下..另外,您的控制器的
RequestMapping
url是什么?我没有REST-servlet.xml配置文件。不过,我在类路径中有jackson jar。什么是
\u csrf.headerName
?@H。鄭 开始尝试使用X-CSRF-TOKEN
$(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);
  });
});
<security:http use-expressions="true">
           ...
   <security:csrf disabled="true" />
</security:http>