Servlet学习日记(二)——405错误解决及各种http状态码总结

错误显示:

HTTP Status 405 - HTTP method GET is not supported by this URL

type Status report

message HTTP method GET is not supported by this URL

description The specified HTTP method is not allowed for the requested resource.
Apache Tomcat/8.0.33
大概的意思就是这个请求的方法不被允许。
现在来看看servlet里的doGet()方法:

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(request, response);
        System.out.println("doGet");
        PrintWriter out = response.getWriter();
        out.println("<h1>hello doGet</h1>");
    }

我们可以看到里面有一句:

super.doGet(request, response);

这个代码的意思就是调用了父类的doGet()方法,用快捷键生成重写方法的代码里都会有这么一句,当时重写方法的时候忘记删掉这句话,可以看到后台输出了
这里写图片描述
说明重写的方法里的代码执行了,问题应该就出在super.doGet()上,把这句话注释掉可以发现不再报405错误,页面能正常输出要显示的内容了。
我们可以看看HttpServlet里的doGet()方法

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
        }
    }

我们可以看到这个方法无论如何都是返回一个http的错误代码,而我的if条件是ture,所以返回了405错误码,我们可以看到

SC_METHOD_NOT_ALLOWED
SC_BAD_REQUEST

这两条代码分别对别的错误代码是405和400
所以我们在创建一个servlet时候要重写它的doGet()和doPost()方法,否则如果执行了父类的这两个代码最后页面都是会报错的。
http的状态码的意思都能从HttpServletResponse这个接口里面看到,下面总结一下各个状态码的意思:
100:客户端可以继续
101:服务器正在根据升级报头交换协议

2XX的都表示正常
200:请求成功正常
201:请求成功并在服务器上创建了一个新资源
202:请求被接受处理,但未完成
203:服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝
204:表示请求成功,但没有新的信息返回
205:服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。
206:服务器已经成功处理了部分 GET 请求

3XX表示重定向
300:被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息
301:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一
302:请求的资源现在临时从不同的 URI 响应请求
303:对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源
304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码
305:被请求的资源必须通过指定的代理才能被访问
307:请求的资源现在临时从不同的URI 响应请求

4XX表示客户端错误
400:表示客户发送的请求在语法上不正确
401:表示请求需要HTTP身份验证
402:该状态码是为了将来可能的需求而预留的
403:表示服务器理解请求,但拒绝实现它
404:请求失败,请求所希望得到的资源未被在服务器上发现,一般出现这种情况都是因为url链接有问题,如不是正确的url链接,或者url链接出现了乱码
405:请求行中指定的请求方法不能被用于请求相应的资源
406:请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体
407:与401响应类似,只不过客户端必须在代理服务器上进行身份验证
408:请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改
409:由于和被请求的资源的当前状态之间存在冲突,请求无法完成
410:被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址
411:服务器拒绝在没有定义 Content-Length 头的情况下接受请求
412:服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个
413:服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围
414:请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务
415:对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝
416:如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码
417:在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足

5XX表示服务器错误
501:服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求
502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应
503:由于临时的服务器维护或者过载,服务器当前无法处理请求,也就是服务器出错了
504:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。注意:某些代理服务器在DNS查询超时时会返回400或者500错误
505:服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体

对于具体出现某些错误状态码应该怎样解决,以后每遇到其中一种再详细说。

猜你喜欢

转载自blog.csdn.net/luqiren/article/details/74840795