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

时间:2015-12-01 08:08:50

标签: forms post jetty http-status-code-405

我知道有很多同名的帖子,但我仍然找不到问题。我正在尝试使用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都会转到默认页面。

有谁知道为什么说这个网址不支持POST?

1 个答案:

答案 0 :(得分: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

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

调查内容:

  • 您在服务器端看到的请求URI是什么? (最重要的部分是URI.path)
  • 客户端遇到的实际Servlet是什么?
  • Servlet为doPost()电话宣布了什么?