HTTP状态405 - 请求方法' GET'调用删除请求时不支持

时间:2018-05-28 14:19:37

标签: spring-mvc datatables bootstrap-4 delete-method

我试图通过调用bootstrap模式为每个数据表行实现删除操作。然后使用username参数向控制器发送删除请求。

   $(document).ready(function () {
    $('#usersTable').DataTable({
        "sAjaxSource": "users/list",
        "sAjaxDataProp": "",
        "aoColumns": [
            {"mData": "username"},
            {"mData": "firstName"},
            {"mData": "lastName"},
            {"mData": "status"},
            {"mData": "role.roleName"},
            {
                mRender: function (data, type, row) {

                    var linkDel = "<a href=\"#\" onclick=\"fillDeleteFrm(\'username\')\">Delete</a>";
                    linkDel = linkDel.replace("id", row.id);
                    linkDel = linkDel.replace("name", row.name);
                    return linkDel;
                }
            }
        ]
    })
});

   function fillDeleteFrm(username) {
    $('#delete-username').val(username);
    $('#userDeleteModal').modal('toggle');
    return false;
}

称为弹簧控制器的百里香形式:

        <div id="userDeleteModal">
            <form id="systemUserForm" th:action="@{/userdelete}" th:method="delete">
                    <input type="hidden" id="delete-username" name="username" th:value="*{username}">
                        <button type="submit" class="btn btn-primary">Delete</button>
                    </div>
                </form>

相应的弹簧控制器:

    @ResponseBody
    @RequestMapping(value="/userdelete", method = RequestMethod.DELETE)
    public ModelAndView deleteEmployee(@RequestParam String username) {
    User user = userService.findUserByUserName(username);
    userService.deleteUser(user);
    return new ModelAndView("users");
  }

即使我调用了删除请求方法,映射也不会路由到此控制器,提醒

HTTP Status 405 - Request method 'GET' not supported

我做错了什么?提前致谢。

1 个答案:

答案 0 :(得分:0)

浏览器不支持表单中的DELETE方法。使用th:method="delete",Thymleaf添加了一个隐藏的_method表单字段。

<input type="hidden" name="_method" value="delete">

如果在应用程序中添加[HiddenHttpMethodFilter][1]过滤器,它会根据_method参数将post请求转换为删除请求。尝试在web.xml文件中添加以下内容。

如果您使用弹簧靴,则会自动包含过滤器。但是在普通的Spring web mvc应用程序中,您必须在web.xml文件中手动添加过滤器。您的应用中可能缺少此过滤器。这就是请求的GET未转换为DELETE请求的原因。

<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>     
</filter-mapping>