访问JavaWeb项目报405错误
一、问题由来
一位朋友最近在学习JavaWeb开发,做测试时出现问题,页面报了405错误,HTTP Status 405 ? Method Not Allowed
如果是只出现一次,那也还好。主要是这个错误他遇到过多次,第一次就是刚开始学习Servlet的时候,还有一次是在学习文件上传的时候出现的。因此就特意写一篇博客来解释说明一下,为什么会出现这种情况。
错误信息如下:
HTTP method GET is not supported by this URL
翻译过来的大致意思就是Get请求方法不支持访问的这个请求路径。
还有一句描述信息如下,
The method received in the request-line is known by the origin server but not supported by the target resource.
翻译过来的大致意思就是:请求中接收到的方法是源服务器已知的,但目标资源不支持。为什么会出现这个问题呢?
二、问题分析
自己让他把项目发过来给我看一下,我去看了一下他写的Servlet,里面有这么一行代码。如下图,虽然重写了HttpServlet的接口,可是没有删除掉super.doGet(req, resp); 是不是这个地方导致的问题呢?
点开super.doGet一看便知。
是不是很熟悉,method get not supported。get方法不支持。看到这里就应该知道问题出在哪里了。
三、解决方案
在Servlet中重写doGet方法或者doPost方法后,需要删除掉super.doGet()或者是super.doPost()方法即可,否则就会出现上面的错误。删除后代码如下,
测试结果如下,
第二次出现问题,该朋友写了一个文件上传的Servlet进行测试,代码如下,重写了doPost方法,
然后这位朋友去浏览器的地址栏中直接输入请求的地址,返回结果如下,又出现405错误,那这又是怎么回事呢?
文件上传重写的是doPost方法,只能接收post请求,而在浏览器地址栏中直接输入请求地址发起的事get请求,所以出现该问题。如果发起的是post请求,而Servlet中重写的是doGet请求的方法,同样会出现类似的错误。示例代码如下,
使用调试工具发送post请求,测试结果如下,
错误类似,post请求不支持。
总结:(1)后台重写什么方法,前端页面就需要发送对应的请求,否则可能出现如上问题。(2)不管是重写doGet方法或者是重写doPost方法,都需要删除掉surper.doGet或者是super.doPost方法,否则也会出现类似的问题。