基于SpringMVC DELETE请求报状态码405,JSPs only permit GET POST or HEAD,请求行中接收的方法由源服务器知道,但目标资源不支持解决方法的探寻

现象

controller代码

    @RequestMapping(value = "/product/{pid}", method = {RequestMethod.DELETE})
    @ResponseBody
    public Result deleteProduct(@PathVariable String pid) {
        productService.deleteProduct(pid);
        Result result = new Result(null, "删除成功");
        return result;
    }

jsp代码

 function deletePorduct(productid) {
        console.log("productid", productid)
        $.ajax({
            url:"product/" + productid +".do",
            type: 'delete',
            contentType: "application/json",
            success: function (data) {
                if (data.httpStatus == 'NO_CONTENT') {
                    alert(data.message);
                    window.location.reload();
                }
            },
            error:function (data) {
                console.log(1,"删除失败")
            }
        });
    }

url真实请求网址如下:
http://localhost:8080/spring_hibenate_wearhouse_war_exploded/product/402880e970aed81d0170aedd65ba0000.do

错误提示如下:
在这里插入图片描述
使用Postman直接访问请求,获得如下页面:
基于SpringMVC DELETE请求报状态码405,JSPs only permit GET POST or HEAD,请求行中接收的方法由源服务器知道,但目标资源不支持解决方法的探寻_第1张图片

参考相关文章,解决问题的方法如下:

1.使用Tomcat7

证实换成7后成功。
此方法不能解决根本问题,如果其他方法不能纠错,可最后尝试。

2.设置目标页面头文件

从JSP 2.3(Tomcat8)开始,规范要求JSP只响应GET,HEAD,POST。所有其他HTTP方法的行为都是未定义的。Tomcat选择拒绝它们来防止HTTP动词篡改攻击。
对于异常处理程序,根据JSP2.3的响应,它会用于转发到JSP以呈现异常和iso JSP视图。
我是用的版本是jdk1.8 tomcat8
在这里插入图片描述
可以尝试重定向到一个错误页面(不是使用错误处理机制),需要设置isErrorPaqe=“true”

我试过后,并没有有效解决。

3.配置HiddenHttpMethodFilter 过滤器

通常的浏览器都只是支持post跟get,这时候就需要HiddenHttpMethodFilter 过滤器来将post请求转换为put跟delete请求。
通过查看源代码我们知道,过滤器将post请求转换为我们对应的put跟delete请求的时候需要有一个name为_method的参数才行。
首先我们需要在web.xml中配置过滤器
       <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>/*
	
然后写一个表单发出post请求,当然别忘了带一个name为_method的参数,这个参数可以通过隐藏域来传递。 
<form action="testPut" method="post">
	<input type="hidden" name="_method" value="PUT"/>
	<input type="submit" value="PUT"/>
</form>

我并没有使用表单提交,故此方法对我也不适用。

4.加上@ResponseBody

其他方法有空再做尝试。

参考网址:

https://blog.csdn.net/qq_37546891/article/details/89840212
https://bz.apache.org/bugzilla/show_bug.cgi?id=56568

你可能感兴趣的:(基于SpringMVC DELETE请求报状态码405,JSPs only permit GET POST or HEAD,请求行中接收的方法由源服务器知道,但目标资源不支持解决方法的探寻)