SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
一:问题demo展示
在开发新需求,调试代码的时候发现一个问题,就是HttpServletRequest 获取不到ajax post请求的json参数!下面是伪代码是整个请求的逻辑!
1.前台JS请求代码(伪代码)
var _phoneId = "123456789";
var closeUrl=contextPath+"/close";
ajax(closeUrl,{"phoneId":_phoneId},"post",false,callbackForSessionClose,null,'json');
function ajax(url,reqData,type,async,successBack,errorBack,statusText,dataType){
$.ajax({
type : type,
url : url,
dataType : dataType,
async : async,
timeout : "60000",
contentType : "application/json",
data : JSON.stringify(reqData),
success : function(data) {
// 成功的处理逻辑
},
error : function(data) {
// 错误的处理逻辑
}
});
}
2.后台代码(伪代码)
@RequestMapping(value="/close",method=RequestMethod.POST)
@ResponseBody
public String closeSession(HttpServletRequest request){
String response;
try{
String phoneId = request.getParameter("phoneId");
if(phoneId == "123456789"){
response = "success";
}else{
response = "error";
}
}catch (ServiceException e) {
//业务异常处理逻辑
}catch (Exception e) {
//非业务异常处理逻辑
}
return response;
}
二:问题分析
正常的post请求(不包括ajax请求)在http头中的content-type为application/x-www-form-urlencoded,这时在java后台可以通过request.getParameter(name)的形式获取.但是通过原生ajax请求时,在java后台通过request.getParameter(name)的形式却无法获取到传入的参数.
原因是原生ajax请求时,在http头中的content-type为text/plain;charset=UTF-8.当请求到达tomcat服务器时,服务器只对application/x-www-form-urlencoded形式的http,post请求进行读取body体中的参数,并放到request的parameter中,对于原生ajax请求则直接忽略,不会读取body体中的参数,才导致request.getParameter(name)读取不到参数.
根据上面的分析结合自己的当前系统,发现系统封装的ajax默认content-type为application/json,那么这种方式在java后台通过request.getParameter(name)的形式是不能获取到传入的参数的!
三:解决方案
1.[前台解决方案]修改Ajax post请求的contentType和data
修改前:
contentType : "application/json",
data : JSON.stringify(reqData),
修改后:
contentType : "application/x-www-form-urlencoded",
data : reqData, //不需要使用JSON.stringify()
后台代码不变!
2.[后台解决方案]使用@RequestBody
前台js代码不变!
后台代码修改:
新增一个类:
public class CloseRequestVO implements Serializable{
private String phoneId;
//省略get set方法
//....
}
@RequestMapping(value="/close",method=RequestMethod.POST)
@ResponseBody
public String closeSession(@RequestBody CloseRequestVO requestVO){
String response;
try{
String phoneId = requestVO.getPhoneId();
if(phoneId == "123456789"){
response = "success";
}else{
response = "error";
}
}catch (ServiceException e) {
//业务异常处理逻辑
}catch (Exception e) {
//非业务异常处理逻辑
}
return response;
}
后台通过request.getParameter(name)方式就可以获取到参数.
上面两种方式选择适合自己系统的方案即可!
四:@RequestBody简单介绍
@RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上
申明:在SpringMVC环境中,@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。
所以
第一:@RequestBody需要接的参数是一个String化的json,前台js代码可以直接使用JSON.stringify(json)这个方法来转化;
第二:从@RequestBody名称上来看,也就是说要读取的数据在请求体(body)里,所以要发post请求;
第三:@RequestBody接收的是一个String的Json,那么要设置请求contentType,contentType:"application/json,明确的告诉服务器发送的内容是json。
五:参考资料
jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明
**如果您觉得这篇博文对你有帮助,请点个赞,谢谢!**
**如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!**
欢迎访问我的csdn博客,我们一同成长!
"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"
博客首页:http://blog.csdn.net/u010648555
SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析的更多相关文章
- springmvc通过ajax异步请求返回json格式数据
jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...
- JAVA发送POST请求携带JSON格式字符串参数
import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.htt ...
- Jmeter请求非Json格式的参数如何添加
Step1: 可以先在用户自定义变量中加入你需要添加的请求类型,具体参考图片 Step2: 在线程组下请求之前添加HTTP信息头管理器
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 使用jQuery发送POST,Ajax请求返回JSON格式数据
问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...
- ajax往后台传json格式数据报415错误
问题描述: ajax往后台传json格式数据报415错误,如下图所示 页面代码 function saveUser(){ var uuId = document.getElementById(&quo ...
- play framework接收post请求json格式的参数
大家在用play framework框架开发第三方调用你的接口的时候并且用json格式的参数post请求 ,参数接收是个问题 ,因为play对表单提交post请求有处理: 有两种方法: 1.直接形参列 ...
- WebService使用JSON格式传递笔记+JQuery测试
原文WebService使用JSON格式传递笔记+JQuery测试 因为一些因素,必须改写WebService,很传统,但是很多公司还在用.. 因为XML 的关系,不想让他传递数据的时候过度肥大,所以 ...
- springMVC中使用ajax传递json数组
解决方法 去www.json.org下载JSON2.js 再调用JSON.stringify(JSONData)将JSON对象转化为JSON串. var people = [{ "UserN ...
随机推荐
- 【洛谷P1991】无线通讯网
题目大意:给定一个 N 个顶点的完全图,边有边权,现在要求使得图中所有顶点联通的情况下,第 M-1 大的边最小值是多少. 题解:所有点联通的最小要求是所有点和连接这些点的边构成原图的一棵生成树,那么问 ...
- LRN
转自https://blog.csdn.net/u011204487/article/details/76026537 LRN全称为Local Response Normalization,即局部响应 ...
- Linux makefile讲解
博客不会讲解的太细致深入,推荐先看视频再看博客 视频链接,推荐去B站观看,B站比较清晰... 土豆网:http://www.tudou.com/programs/view/19VZ0f3b_I0 B站 ...
- Spark记录-官网学习配置篇(一)
参考http://spark.apache.org/docs/latest/configuration.html Spark提供三个位置来配置系统: Spark属性控制大多数应用程序参数,可以使用Sp ...
- Java迭代器用法
public class Test01 { public static void main(String[] args) { List list = new ArrayList(); list.add ...
- javascript类式继承函数最优版
直接上代码: klass函数 var klass = function (Parent, props) { var Child, F, i; //1.新构造函数 Child = function () ...
- [BZOJ 2257][JSOI2009]瓶子和燃料 题解(GCD)
[BZOJ 2257][JSOI2009]瓶子和燃料 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子 ...
- nagios报警延迟的解决--flapping state
这个问题是在测试中发现的.因为要在服务器上布置nagios用来监控oracle,可是发现手动shutdown数据库后能够很快报警,但是再startup后就不是很及时,有时会延迟很久.经过研究发现了这个 ...
- VS 2013 中如何自定义快捷键(图解)
随着软件的升级其功能也越来越多,所以相应的快捷键也多了起来.VS2013中的快捷方式已经发展为了两个快捷键的组合.例如VS2013中默认的多行注释的快捷功能键为(ctrl+k,ctrl+u).像这样类 ...
- 『实践』Yalmip+Ipopt+Cplex使用手册
Yalmip+Ipopt+Cplex使用手册 1.软件版本 Cplex 12.6.2,Matlab R2014a,Ipopt 3.12.9,Yalmip 2.Cplex添加方法 官方下载地址: htt ...