SpringMVC HTTP 状态 405 - 不支持请求方法“POST”

Posted

技术标签:

【中文标题】SpringMVC HTTP 状态 405 - 不支持请求方法“POST”【英文标题】:SpringMVC HTTP Status 405 - Request method 'POST' not supported 【发布时间】:2013-03-03 05:24:48 【问题描述】:

我有一个表单,我从该表单查询数据库并将结果发布到另一个页面。然后我从查询结果中选择一条记录,它会将我带回到我进行查询的页面,以便我可以更新记录。

我单击更新将我带回控制器并返回第一次调用查询的相同方法,但是请求的参数现在是“更新”,因此假设转到方法中的更新条件。好像我无法将页面重新提交到相同的 url 映射。

控制器

   @RequestMapping(value="citizen_registration.htm", method = RequestMethod.POST)
    public ModelAndView handleRequest(@Valid @ModelAttribute Citizens citizen, 
            BindingResult result,  ModelMap m, Model model,
            @RequestParam(value="user_request") String user_request) throws Exception 


        try
             logger.debug("In Http method for CitizenRegistrationController - Punishment Registration");
             logger.debug("User Request Is " + user_request);


                 if(result.hasErrors())

                //handle errors

                    // return new ModelAndView("citizen_registration");
                 else

                     //check if its a save or an update

                     if(user_request.equals("Save"))
                        //do save

                        else if (user_request.equals("Query"))

                        //do query

                        else if (user_request.equals("Update"))
                        //do update

                
    

错误日志

34789 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet  - Bound request context to thread: org.apache.catalina.connector.RequestFacade@2ba3ece5
34791 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'crimetrack' processing POST request for [/crimeTrack/getCitizen/citizen_registration.htm]
34792 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@3a089b3] in DispatcherServlet with name 'crimetrack'
34792 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping  - Looking up handler method for path /getCitizen/citizen_registration.htm
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver  - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver  - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver  - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
34796 [http-bio-8084-exec-3] WARN  org.springframework.web.servlet.PageNotFound  - Request method 'POST' not supported
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet  - Null ModelAndView returned to DispatcherServlet with name 'crimetrack': assuming HandlerAdapter completed request handling
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet  - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@2ba3ece5
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet  - Successfully completed request
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Publishing event in WebApplicationContext for namespace 'crimetrack-servlet': ServletRequestHandledEvent: url=[/crimeTrack/getCitizen/citizen_registration.htm]; client=[127.0.0.1]; method=[POST]; servlet=[crimetrack]; session=[null]; user=[null]; time=[8ms]; status=[OK]
34796 [http-bio-8084-exec-3] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/crimeTrack/getCitizen/citizen_registration.htm]; client=[127.0.0.1]; method=[POST]; servlet=[crimetrack]; session=[null]; user=[null]; time=[8ms]; status=[OK]

萤火虫

检查 FireBug 我得到了这个 "NetworkError: 405 Method Not Allowed - http://localhost:8084/crimeTrack/getCitizen/citizen_registration.htm" 这应该是 http://localhost:8084/crimeTrack/citizen_registration.htm"`

getCitizen 是我在第一次执行查询时进入的页面,它包含在 url 中。

我将 jsp 表单操作定义更改为 <form:form id="citizenRegistration" name ="citizenRegistration" method="POST" commandName="citizens" action="<%=request.getContextPath()%>/citizen_registration.htm"> 但是当我启动应用程序并向此页面发出请求时,我得到:

HTTP Status 500 - /WEB-INF/jsp/citizen_registration.jsp (line: 31, column: 116) attribute for %>" is not properly terminated 

【问题讨论】:

您的处理程序方法被映射到citizen_registration.htm。您的控制器类是否映射到 /getCitizen @digitaljoel 是的,/getCitizen 有一个单独的映射,但我想访问的映射是 /citizen_registration 但是我看到 getCitizen 进入 url 我知道它与 ContextPath 有关,但我是不确定我是否正确配置它。我更新了在 jsp 中显示配置的问题 @dev_darin,我怀疑操作 url 会出现问题。在 jsp 中试试这个 /getCitizen/citizen_registration.htm"> @GMR 是的,这就是错误 getCitizen 是控制器中的映射,但是一旦发生这种情况,它就会以一种形式从 href 调用,它会将自身附加到 url 的原因以及如何解决这个问题 @dev_darin 会更好,尝试在脚本中提交表单。在控制器中你不需要提及 htm 扩展,因为它是可选的,请交叉验证 web.xml 【参考方案1】:
function submitPage()
     document.getElementById("citizenRegistration").action="getCitizen/citizen_registration.htm";
     document.getElementById("citizenRegistration").target="_self";    
     document.getElementById("citizenRegistration").method = "POST";
     document.getElementById("citizenRegistration").submit();

你可以调用上面提到的方法。使用 onclick 绑定提交按钮的功能

【讨论】:

我需要一些帮助,从来没有使用过很多 jquery。当我单击更新按钮时,我希望将页面与citizen_registration url 一起提交给控制器。这就是我在citizen_registration 页面上的内容。 $('#update').bind('click', function() submitPage(); );更新是一个提交按钮,这会起作用吗? 是的,你也可以这样做或者可以直接在onclick属性中提及,比如onclick="submitPage()" 它是如何找到预执行的操作的?我知道它是一个提交按钮,并且有一个提交定义,所有提交、目标和方法都使用操作 url? 这是一个 JS 内置函数。这将是请求。它与点击功能相同..检查一次..javascript-coder.com/javascript-form/… 我只有一个问题,您如何获取发布的按钮值,因为我阻止了按钮的默认设置,并且我正在使用 request.getParameter 来获取按钮值。

以上是关于SpringMVC HTTP 状态 405 - 不支持请求方法“POST”的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC HTTP 状态 405 - 不支持请求方法“POST”

不支持 Spring MVC 请求方法“POST”-> HTTP 405

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

HTTP 状态 405 - 此 URL 不支持 HTTP 方法 POST

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

Spring Boot POST 请求返回 http 状态 405“方法不允许”而不是 HTTP 状态 404