最近在做Web开发的时候,使用$.post提交数据,但是回调函数却没有被触发,按F12看控制台输出是:POST *** 400 Bad Request

后台是SpringMVC的,设置了断点也不会被触发。

后来查看JQuery资料了解到,$.post提交数据只有成功时才触发回调函数,于是改用$.ajax提交数据,添加error回调函数,得到错误信息了,如下图:

这个问题是什么原因造成的呢?

后来经过测试发现,是表单提交的内容数据类型与实体的(也就是数据表字段)的数据类型不匹配导致的。

在提交表单之前应该对用户输入的内容做验证,后台直接做映射了,没有做内容验证的机会。

解决方法:

上面只是描述了问题产生的原因,而并没有给出解决的方法,很多小伙伴其实看到原因就已经想到解决方法了。

那有些小伙伴可能刚接触,还搞不清状况,我就再说一下解决的步骤:

1、改用$.ajax提交数据,添加error回调函数(其实在开发中严格来说是不允许使用$.post的,因为失去了错误处理的功能);

类似代码如下,具体请参考JQurey参考手册:

$.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
},
error: function(XMLHttpRequest){
alert( "Error: " + XMLHttpRequest.responseText);
}
});

这样你就可以通过 XMLHttpRequest.responseText 或XMLHttpRequest.responseHTML 了解到后端代码到底发生了什么错误。

2、不要把生成实体的工作交给MVC框架来完成

你的产生问题的代码,我猜测可能类似如下:

	/**
* 添加用户.
**/
@RequestMapping("/adduser.do")
@ResponseBody
public void adduser(HttpServletRequest request, HttpServletResponse response, User user) throws Exception {
this.userManager.saveOrUpdate(user);
}

这样做就导致上面说过的问题:后台直接做映射了,没有做内容验证的机会;明明一个字段要求数字,结果用户输入了字母或汉字。

正确的方法类似如下:

	/**
* 添加用户.
**/
@RequestMapping("/adduser.do")
@ResponseBody
public void adduser(HttpServletRequest request, HttpServletResponse response) throws Exception {
//将形参 user 拿到函数内部定义创建
User user = new User();
//这里对用户的年龄就要进行判断,具体规则你自己定义,我只是举个例子
Integer age = getInteger("age");
if (age != null){
uset.SetAge(age);
}
this.userManager.saveOrUpdate(user);
} protected Integer getInteger(String name) {
String str = this.request.getParameter(name);
if (StringUtils.isNotBlank(str)) {
return Integer.valueOf(str);
}
return null;
}

转:POST 400 Bad Request The request sent by the client was syntactically incorrect的更多相关文章

  1. HTTP Status 400 - description The request sent by the client was syntactically incorrect.

    HTTP Status 400 - type Status report message description The request sent by the client was syntacti ...

  2. 错误:The request sent by the client was syntactically incorrect的解决

    问题: 错误400-The request sent by the client was syntactically incorrect. springMVC中,某个页面提交时报400错误,如下图. ...

  3. SpringMVC---400错误The request sent by the client was syntactically incorrect ()

    在SpringMVC中使用@RequestBody和@ModelAttribute注解时遇到了很多问题,现记录下来. @ModelAttribute这个注解主要是将客户端请求的参数绑定参数到一个对象上 ...

  4. The request sent by the client was syntactically incorrect.

    HTTP Status 400 - type Status report message description The request sent by the client was syntacti ...

  5. SpringMVC报错The request sent by the client was syntactically incorrect ()

    springmvc数据绑定出的错 在数据绑定的时候一定要主意Controller方法中的参数名和jsp页面里的参数名字是否一致或者按照绑定的规范来写, 如果不一致,可能回报如下错误: The requ ...

  6. "The request sent by the client was syntactically incorrect ()"问题定位及解决:

    Spring MVC "The request sent by the client was syntactically incorrect ()"解决办法: 把spring日志级 ...

  7. The request sent by the client was syntactically incorrect问题解决

    The request sent by the client was syntactically incorrect意思嘛,google翻译一下 通过日志不难看出,是由参数不匹配造成的. 所以对于Da ...

  8. spring mvc 在上传图片时,浏览器报The request sent by the client was syntactically incorrect

    项目中,在一个jsp页面里其它图片上传是功能是可以使用的,当我自己新加了一个图片上传时,提交表单后,浏览器报The request sent by the client was syntactical ...

  9. 又见The request sent by the client was syntactically incorrect ()

    前几天遇到过这个问题(Ref:http://www.cnblogs.com/xiandedanteng/p/4168609.html),问题在页面的组件name和和注解的@param名匹配不对,这个好 ...

随机推荐

  1. c# 使用protobuf格式操作 Redis

    protobuf格式介绍 1.protobuf为goole定义的类似于json的数据格式.2.最终都需要序列化为二进制形式进行传输存储.3.相对于xml,json格式来说,序列化为二进制后占用空间更小 ...

  2. Android的性能优化

    ArrayList和Vector ArrayList和Vector都是内部以数组实现的List,它们两唯一的区别就是对多线程的支持,ArrayList是线程不安全的,而Vector内部对大多数方法都做 ...

  3. WebGoat系列实验Injection Flaws

    WebGoat系列实验Injection Flaws Numeric SQL Injection 下列表单允许用户查看天气信息,尝试注入SQL语句显示所有天气信息. 选择一个位置的天气,如Columb ...

  4. [译]Javascipt中的Strings

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  5. python web框架(bottle,flask,tornado)

    Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip i ...

  6. GetTop(),GetTopLeft()等等

    Panel_BattleInfo挂在屏幕最上方 protected override void OnStart() { Vector3 = pos = GetTop(); transform.Find ...

  7. Service Fabric 注意事项

    1. ActorTimer和ActorReminder会阻塞一个Actor的其他外部方法调用,即ActorTimer和ActorReminder内部就去未执行完毕之前,该Actor其他方法只能等待. ...

  8. 小 M 的算式(dfs)

    [问题描述]小 M 在做数学作业的时候遇到了一个有趣的问题:有一个长度为 n 的数字串 S,小 M 需要在数字之间填入若干个“+”和恰好一个“=”,使其成为一个合法的等式.如对于 S=“2349”,可 ...

  9. loj #2037. 「SHOI2015」脑洞治疗仪

    #2037. 「SHOI2015」脑洞治疗仪   题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见 ...

  10. 一些优秀的Firefox扩展

    AdBlock Plus 拦截广告. 在对付CSDN等垃圾网站时非常有用. Block Site 拦截你不想看的网站 没有知乎的一天真好... XStyle 设置自己喜欢的CSS样式(表示自己并不会用 ...