为啥此 URL 不支持 HTTP 方法 POST [重复]

Posted

技术标签:

【中文标题】为啥此 URL 不支持 HTTP 方法 POST [重复]【英文标题】:why HTTP method POST is not supported by this URL [duplicate]为什么此 URL 不支持 HTTP 方法 POST [重复] 【发布时间】:2017-01-11 23:30:05 【问题描述】:

我正在学习 Java EE 和 Maven,我正在尝试一个简单的 dopost。但我得到了(此 URL 不支持 HTTP 方法 POST)可能是什么问题 登录.jsp

<form action="/login" method="post" >
<div class="login-container less">
    <div class="well-login">
        <div class="control-group">
            <div class="controls">
                <div>
                    <input type="text" placeholder="Username or Email" class="login-input user-name">
                </div>
            </div>
        </div>
        <div class="control-group">
            <div class="controls">
                <div>
                    <input type="password" placeholder="Password" class="login-input user-pass">
                </div>
            </div>
        </div>
        <div class="clearfix">
            <button class="btn btn-inverse login-btn" type="submit" value="submit">Login</button>
        </div>
        <div class="remember-me">
            <input class="rem_me" type="checkbox" value=""> Remeber Me
        </div>
    </div>
</div>
</form>

登录小服务程序

package webapp;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException 
        request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);
    

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

        super.doPost(request, response);
        response.getWriter().println("success");
    

看不到错误来自哪里?从我这边看,一切都很好 求救

【问题讨论】:

【参考方案1】:

删除这一行:

    super.doPost(request, response);

HttpServlet 基类中的 doPost 方法被实现为无条件返回 HTTP 错误(HTTP 1.1 为 405,HTTP 1.0 为 400)。 doGetdoPutdoDelete 都以相同的方式实现。

如果您希望您的 servlet 支持 POST 请求,请覆盖 doPost 但不要调用超类方法。

【讨论】:

你能解释一下关于覆盖 super.doPost(request, response); 的更多信息吗?抛出 Http 错误 405? @B'bekShakya:我不完全理解你的问题。如果问题是“为什么超类方法会抛出 HTTP 错误 405”,那么答案是因为它的实现者选择这样做。参见 Tomcat 的 HttpServlet 实现here。据我所知,HttpServlet javadoc 并没有说明基类方法应该做什么。 谢谢您,先生,我想了解一下底层的基类方法。就像你说的那样,文件并没有真正提供给我。【参考方案2】:

当您的页面在web-inf文件夹内时,需要保护不受Http访问的资源放在WEB-INF下,并在查看(jsp/html/.doc/.txt/xml)时附加过滤器以防止直接访问。

所以在 doGet() 中使用getServletContext()

request.getServletContext().getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);

由于您不会使用doPost() 方法导航任何其他页面,因此请使用include() 方法

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException        
    response.getWriter().println("<h1>success</h1>  ");
    request.getServletContext().getRequestDispatcher("/WEB-INF/views/login.jsp").include(request, response);

删除您在 dopost() 中覆盖 super.doPost(request, response); 以及 &lt;form action="login" method="post" &gt; 从登录中删除“/”

【讨论】:

以上是关于为啥此 URL 不支持 HTTP 方法 POST [重复]的主要内容,如果未能解决你的问题,请参考以下文章

部署到 jboss EAP 7.1 时,此 URL 不支持 HTTP Post 方法

此 URL Java servlet 不支持 HTTP 方法 POST

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

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

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

此 URL 不支持带有简单 servlet 的 HTTP 方法 GET