org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported

项目环境:springboot+shiro+jpa
问题描述:首先我在postman用GET方式请求“登出”接口,返回请求方法错误
在这里插入图片描述

由于没有把堆栈信息打印出来,所以根据这简简单单的六个字我无法排查到问题的原因。接着我根据返回的报错信息去项目中查找是哪个方法给我返回的
在这里插入图片描述

自己把堆栈信息输出
在这里插入图片描述

在这里插入图片描述
上面的堆栈信息我们看到说“不支持GET方式请求”,这个时候我们去看一下Controller配置的请求方式(如下图),确认是GET请求。网上有一些解决办法说是自己指定请求方式,像这样 method = Request.GET,不要用GetMapping。我也试了,但我的不是这个问题。我也试过把这个接口改成POST方式然后用postman用POST方式该接口,但是控制台仍然报异常“Request method ‘GET’ not supported”。这个时候我就纳闷了,哪来的GET请求啊!!!!什么rebuild项目啊,重启啊,什么把请求参数封装成RequestBody不要放在url上我都试过了,还是不行。
在这里插入图片描述

后来我在org.springframework.web.servlet.DispatcherServlet这个类的doDispatch方法上面打断点,观察到request参数如下图,发现coyoteRequest变成了/admin/login,而login是使用POST方法请求的,这样报“Request method ‘GET’ not support”异常也就说得通了,那么为什么我请求“登出”接口会变成“登录”接口呢?我在仔细观察了request参数
在这里插入图片描述
在这里插入图片描述

如下图发现,这个request是ShiroHttpServletRequest而不是HttpServletRequest,基本可以确定是Shiro的过滤器对HttpServletRequest做了处理了,于是我查看Shiro的配置文件
在这里插入图片描述

Shiro的配置文件如下,只要把这一句注释掉,或者把登出接口的mapping由“/logout”改成其他就勉强算解决问题了
在这里插入图片描述

说在最后:我最后说“算勉强解决了”是因为,我还不了解shiro的底层原理,不明白为什么调用“/logout”方法的时候它会去调用“/login”,后面要是我研究出来了会继续更新此文章。

发布了60 篇原创文章 · 获赞 41 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/aimashi620/article/details/86140529