当 doPost 被覆盖时,此 URL 不支持 HTTP 方法 POST

Posted

技术标签:

【中文标题】当 doPost 被覆盖时,此 URL 不支持 HTTP 方法 POST【英文标题】:HTTP method POST is not supported by this URL when doPost is overriden 【发布时间】:2016-03-05 02:02:41 【问题描述】:

我知道有很多同名的帖子,但我仍然找不到问题。我正在尝试使用 post 提交注册表单以在数据库中注册用户,但是当我单击提交按钮时出现标题错误。这似乎是由于没有

doPost(HttpServletRequest, HttpServletResponse) 

在被调用的类中,但我确实有一个,这就是为什么我看不到问题。

要提交的表单位于 URL:/Story/register

<form method="post" action="RegisterHandler">
    <label>Username: <input type="text" name="desired_username" value="" size="10"></label><br><br>
    <label>Password: <input type="password" name="desired_pass" value="" size="10"></label><br><br>
    <input type="submit" name="commit" value="Register">
</form>

在提交时,url 变为 /Story/RegisterHandler。我有一个调度程序将此 url 映射到实际的 Registerhandler 类。

 URL url = new URL(request.getRequestURL().toString());
 String path = url.getPath();
 String parts[] = path.split("/");
 if(parts.length>2)
                        if("story".equals(parts[2]))
                                this.log(requestIp + ": " + "- User: Sean - Email: test@test.com - Accessed a story.");
                                new Story().doGet(request, response);
                         else if ("about".equals(parts[2]))
                                log(requestIp + ": " + "- User: Sean - Email: test@test.com - Accessed a the about page");
                                about(request, out, cfg);
                         else if ("default.css".equals(parts[2])) //needed because dispatcher sends href to external stylesheet to the default page
                                defaultCss(request, out, cfg);
                         else if ("register".equals(parts[2]))
                                log(requestIp + ": " + "- User: Sean - Email: test@test.com - Accessed a the register page.");
                                register(request, out, cfg);
                         else if ("RegisterHandler".equals(parts[2]))
                                log(requestIp + ": " + "- User: Sean - Email: test@test.com - Accessed RegisterHandler");
                                new RegisterHandler().doPost(request, response);
                         else 
                                log(requestIp + ": " + "- User: Sean - Email: test@test.com - Accessed the default page");
                                new Default().doGet(request, response);
                        

调度程序在所有情况下都有效,除了我认为是由于错误的 RegisterHandler 情况。

RegisterHandler类如下:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
            cfg = new Configuration(Configuration.VERSION_2_3_22);
            cfg.setDirectoryForTemplateLoading(new File("/home/ubuntu/jetty-distribution-9.3.3.v20150827/cse383base/webapps/Story"));
            cfg.setDefaultEncoding("UTF-8");

            PrintWriter out = response.getWriter();
            try 
                    this.generatePage(request, out, cfg);
             catch (Exception e) 
                    e.printStackTrace(out);
            
    

我知道 Dispatcher 中的 if 语句正在从提交按钮获取正确的 URL,因为任何其他 URL 都只会转到默认页面。

有人知道为什么说 url 不支持 POST 吗?

【问题讨论】:

【参考方案1】:

线索就是消息...

HTTP method POST is not supported

该消息由 javax.servlet.http.HttpServlet doPost(HttpServletRequest request, HttpServletResponse response) 默认实现生成。

见:https://github.com/jetty-project/codehaus-servlet-api/blob/servlet-3.0/src/main/java/javax/servlet/http/HttpServlet.java#L351-L361

这意味着发出的请求 URI 正在访问没有覆盖 void doPost(HttpServletRequest request, HttpServletResponse response) 的 Servlet。

调查什么:

在服务器端看到的请求 URI 是什么? (最重要的部分是 URI.path) 您的客户端实际访问的 Servlet 是什么? 该 Servlet 为其 doPost() 调用声明了什么?

【讨论】:

以上是关于当 doPost 被覆盖时,此 URL 不支持 HTTP 方法 POST的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET [重复]

HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]

Phpunit 错误“此 PHPDBG 版本不支持代码覆盖率”

Servlet详解--doget与dopost区别

eclipse ee servlet tomcat doPost http405

doPost和doGet的区别?