搜尋

首頁  >  問答  >  主體

java - SpringMvc Post表单数据的一个问题

spring-mvc 前端post表单数据到后台,后台没有接收到,并且用HttpServletRequest获取参数列表为空,下面为代码:

web.xml:

<servlet>
        <servlet-name>embers</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:conf/embers-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>embers</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

mvc配置文件:

<context:component-scan base-package="embers.blog.controller" />

controller:

@Controller
public class BugTestController {
    
    
    @RequestMapping(value="/demo",method=RequestMethod.POST)
    public String demo(HttpServletRequest request,HttpServletResponse response) throws IOException{
        System.out.println(request.getParameterMap());
        System.out.println(request.getParameter("username"));
        System.out.println(request.getParameter("password"));
        System.out.println(request.getContentType());
        System.out.println("//");
        response.setContentType("text/html");
        response.getWriter().println("keke");
        response.getWriter().flush();
        response.getWriter().close();
        return null;
    }
}

我已经调试过无数次了,如果设定为GET方法,然后把参数放在URL上是完全没有问题的,用json提交,配置json转换也是没有问题的,就是默认的POST表单数据有问题,下面是调试工具生成的表单完整报文:

POST /BugTest/rest/demo HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

username=111wqfewrf&password=321&=

一直都是好好的,这么简单的demo,现在突然不行了,好久没写springmvc了,我漏了什么吗?

大家讲道理大家讲道理2802 天前831

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-18 10:17:17

    順便提一下,即使是用springmvc的註解 : RequestParam ,也是取不到的,整個表單資料都是空的

    我是用工具自己一個一個字符寫的報文,也用jsp試過,同樣拿到400

    <form action="${pageContext.request.contextPath }/demo.ember" method="post">
            <input type="text" name="username"/>
            <input type="text" name="password"/>
            <input type="submit" value="提交"/>
    </form>

    錯誤回傳:

    HTTP Status 400 - Required String parameter 'username' is not present

    瀏覽器調試,發送的報文:

    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate
    Accept-Language:en-US,en;q=0.8
    Cache-Control:max-age=0
    Connection:keep-alive
    Content-Length:26
    Content-Type:application/x-www-form-urlencoded
    Cookie:JSESSIONID=7872810B7BE203B784A906C3D49418D1
    Host:localhost:8080
    Origin:http://localhost:8080
    Referer:http://localhost:8080/BugTest/demo.jsp
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36
    
    username=wsa&password=esdx
    

    在後台,用HttpServelet取得ContentType,的確為application/x-www-form-urlencoded,但是取得整個ParameterMap或單一Parameter,都是空,取得body,也是空,但是換成GET,參數放在url中,完全沒有問題



    今天到了公司,將程式碼重新敲了一遍,一模一樣的程式碼,公司是可以取到的,各種測試都是通的,不知道為什麼在家裡取不到,分析下原因:
    初步估計為tomcat版本引發的bug,公司中使用的tomcat版本是8.0.29 ,家裡的不知道,今晚再回去查下tomcat版本,順便查下該版本的bug list

    持續更新。 。 。



    fix了,是tomcat8.0.29的一個bug,大家用表單資料的時候注意了,當然,寫rest的不用管

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:17:17

    表單呢?確認那些字段寫在form裡了?

    回覆
    0
  • 取消回覆