【问题标题】:403 Forbidden Error on Spring Ajax GET RequestSpring Ajax GET请求上的403禁止错误
【发布时间】:2013-10-03 10:25:27
【问题描述】:

基本上只是想在我的 Spring Web 应用程序中实现一些 ajax。出于测试目的,我尝试编写一些代码,以便在他们按下链接/按钮时根据他们的个人“id”值检索“用户”信息。我假设这是服务器端错误,我的控制器有问题,尽管我不完全确定并且需要帮助才能使其正常工作。这是我当前的 JSP 页面,仅用于测试:

<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 class="update" href="<c:url value="/viewUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Update</button></a>
            </td>
            <td>
                <a class="delete" href="<c:url value="/deleteUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Delete</button></a>
            </td>
            <td>
                <a class="ajax" href="<c:url value="/ajax"><c:param name="id" value="${user.id}"/></c:url>">Ajax</a>
            </td>
        </tr>
    </c:forEach>
</table>

<script type="text/javascript">
    $(document).ready(function(){
        $('.ajax').click(function(e){
            e.preventDefault();
            $.ajax({
                url:"http://localhost:8080/SDP_v1.7/ajax",
                type: 'GET',
                dataType:'json',
                contentType: 'application/json',
                mimeType: 'application/json',
                succes: function(user){
                    alert(user.id + " + " + user.username);
                },
                error:function(user,status,er) { 
                    alert("error: "+user+" status: "+status+" er:"+er);
                }
            });
        });
    });
</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(value = "/ajax", method = RequestMethod.GET)
public @ResponseBody User getUser(@PathVariable Integer id) {
    return usersService.getUser(id);
}

这是我在控制台中弹出的错误:

GET http://localhost:8080/SDP_v1.7/ajax 403 (Forbidden) jquery.js:5

发送 jquery.js:5 x.extend.ajax jquery.js:5 (匿名功能)用户:106 x.event.dispatch jquery.js:4 v.句柄

本质上,我的目标是将每个用户的信息加载到带有表单的弹出模式中。虽然我必须先让这一步工作。谢谢

【问题讨论】:

    标签: jquery ajax spring jsp spring-mvc


    【解决方案1】:

    您是从端口 80 上的网络服务器来的吗?如果是这样,那么您正在处理跨站点脚本问题,因为在不同的端口上仍然很重要。你可能想看看JSONP with jQuery

    编辑:Here is a tutorial.

    【讨论】:

    • 是的,我在内部运行它,所以目前端口是 8080。 JSONP 是绕过这个问题的一种方法吗?
    【解决方案2】:

    首先你的控制器是错误的,你的映射不包含路径变量,那么它应该映射到什么?

    @RequestMapping(value = "/ajax/{id}", method = RequestMethod.GET)
    public @ResponseBody User getUser(@PathVariable Integer id) {
        return usersService.getUser(id);
    }
    

    第二个你的请求是错误的,因为你正在调用 /ajax 而你应该调用类似 /ajax/&lt;userid&gt; 的东西,否则控制器永远不会知道你想要哪个用户。

    <script type="text/javascript">
        $(document).ready(function(){
            $('.ajax').click(function(e){
                var url = $(this).attr("href");
                e.preventDefault();
                $.ajax({
                    url: url,
                    type: 'GET',
                    dataType:'json',
                    contentType: 'application/json',
                    mimeType: 'application/json',
                    succes: function(user){
                        alert(user.id + " + " + user.username);
                    },
                    error:function(user,status,er) { 
                        alert("error: "+user+" status: "+status+" er:"+er);
                    }
                });
            });
        });
    </script>
    

    第三,您的 jsp 错误,因为它会生成一个没有 id 的 URL(没有路径变量,而是一个请求参数)。使用&lt;spring:url ../&gt; 方便使用。

    <a class="ajax" href="<spring:url value="/ajax/{id}"><spring:param name="id" value="${user.id}"/></spring:url>">Ajax</a>
    

    我强烈建议阅读the Spring Reference Guideweb chapter 应该可以阐明这个问题。调用是否通过 AJAX 无关紧要,首先修复您的映射,然后添加 AJAX。

    【讨论】:

    • 感谢您的回复。我已经实施了这些更改,但似乎仍然存在同样的问题。还有什么我可以看的吗?
    • 尝试在没有ajax的情况下访问url,看看它是否产生响应。调用http://localhost:8080/SDP_v1.7/ajax/1(或任何你的id)应该会产生一个json结果。如果可行,它必须是您的 ajax 调用,否则您的 spring 配置。 403 表示禁止使用 Spring Security 吗?
    • 是的,我确实使用了 Spring Security,尽管我已经允许在配置中发生绕过。
    • 这就是我的 spring 安全配置。对吗?
    • 我尝试使用 POSTMAN 的 chrome 工具来访问 URL,尽管我收到拒绝访问错误。我不知道还有什么可能。
    【解决方案3】:
    succes: function(user){
                    alert(user.id + " + " + user.username);
                },
    

    也许它的成功而不是成功

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 2017-05-01
      • 1970-01-01
      • 2021-05-07
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多