当 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 版本不支持代码覆盖率”