Ajax传参到后台 400 Bad Request如何解决
此问题解决了花了半天。特此记录一下
jsp页面发送ajax请求,返回请求错误信息400.
我把出错原因定位在,ajax所传的参数非法上。后台springmvc的控制器识别不了,导致提示错的请求400
用了很多办法,改写参数,都还是报原来错误
data : JSON.stringify({json数据}) //1)尝试用转换
var param = {json格式数据};
data : param //2)尝试用变量方式
Java Springmvc controller代码。接收请求
//ajax json @RequestMapping(value = "/{bookId}/appoint", method = RequestMethod.POST, produces = { "application/json; charset=utf-8" }) @ResponseBody private Result<AppointExecution> appoint(@PathVariable("bookId") Long bookId, @RequestParam("studentId") Long studentId) { if (studentId == null || studentId.equals("")) { return new Result<>(false, "学号不能为空"); } ......... }
JSP ajax 请求
function requestByJson(bid) { //alert(bid); var stid=12345678911; var p = {'studentId':stid}; $.ajax({ type : 'post', url : "${pageContext.request.contextPath }/book/"+bid+"/appoint", //设置contentType类型为json contentType : 'application/json;charset=utf-8', //json数据 data: {'studentId':stid}, dataType: "json", //请求成功后的回调函数 success : function(data) { alert(data); } }); }
json格式的参数是没写错的。 但就是请求错误。controller打断点,请求也没进去。
查到一个问题分析和解决办法,原回答如下:
400的错误表示,是请求参数错误。我们关注点就在请求参数那里。你ajax请求过去的参数是json格式的,springmvc接收的时候是想用key-value方式来接收,这样就出了问题。最简单的修改方式就是,去掉contentType的设置,使用默认contentType,参数这样子传:data:"longInstCode=" + longInstCode
我把 contentType : 'application/json;charset=utf-8', 注释掉。 参数格式还是json没改。
经测试总算跑通了。
但问题来了,参数格式没变,contentType也是说明前台传参类型为json。为什么报错呢。
查看官方文档说明,原文如下:
contentType (default:
'application/x-www-form-urlencoded; charset=UTF-8'
)When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to
$.ajax()
, then it is always sent to the server (even if no data is sent). As of jQuery 1.6 you can pass false
to tell jQuery to not set any content type header. Note: The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding. Note: For cross-domain requests, setting the content type to anything other than application/x-www-form-urlencoded
, multipart/form-data
, or text/plain
will trigger the browser to send a preflight OPTIONS request to the server.还是不大理解。
preflight OPTIONS request
Tomcat的HttpServletRequest类的实现类为org.apache.catalina.connector.Request(实际上是org.apache.coyote.Request),而它对处理请求参数的方法为protected void parseParameters(),这个方法中对Content-Type multipart/form-data(文件上传)和application/x-www-form-urlencoded(POST请求)的处理代码如下:
protectedvoid parseParameters() { //省略部分代码...... parameters.handleQueryParameters();// 这里是处理url中的参数 //省略部分代码...... if ("multipart/form-data".equals(contentType)) { // 这里是处理文件上传请求 parseParts(); success = true; return; } if(!("application/x-www-form-urlencoded".equals(contentType))) {// 这里如果是非POST请求直接返回,不再进行处理 success = true; return; } //下面的代码才是处理POST请求参数 //省略部分代码...... try { if (readPostBody(formData, len)!= len) { // 读取请求体数据 return; } } catch (IOException e) { // Client disconnect if(context.getLogger().isDebugEnabled()) { context.getLogger().debug( sm.getString("coyoteRequest.parseParameters"),e); } return; } parameters.processParameters(formData, 0, len); // 处理POST请求参数,把它放到requestparameter map中(即request.getParameterMap获取到的Map,request.getParameter(name)也是从这个Map中获取的) // 省略部分代码...... } protected int readPostBody(byte body[], int len) throws IOException { int offset = 0; do { int inputLen = getStream().read(body, offset, len - offset); if (inputLen <= 0) { return offset; } offset += inputLen; } while ((len - offset) > 0); return len; }
从上面代码可以看出,Content-Type不是application/x-www-form-urlencoded的POST请求是不会读取请求体数据和进行相应的参数处理的,即不会解析表单数据来放到request parameter map中。所以通过request.getParameter(name)是获取不到的。
相关推荐
基于ssm开发的图书管理系统基于ssm开发的图书管理系统基于ssm开发的图书管理系统基于ssm开发的图书管理系统基于ssm开发的图书管理系统基于ssm开发的图书管理系统基于ssm开发的图书管理系统基于ssm开发的图书管理系统...
Java图书管理系统SSM是一个基于Java技术栈开发的实用软件,主要目标是实现对图书资源的有效管理,提供给普通用户和图书管理员两类不同的使用权限。在这个系统中,SSM框架是核心,它由Spring、SpringMVC和MyBatis三个...
在这个“ssm图书管理系统”项目中,我们主要关注以下几个核心知识点: 1. **Spring框架**:Spring是Java企业级应用的核心框架,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...
【图书管理系统ssm+maven】是一个基于Java技术栈开发的Web应用,主要目的是为了管理和维护图书馆的书籍资源。系统利用了Spring、Spring MVC和MyBatis(SSM)框架进行构建,结合Maven进行项目构建和依赖管理。下面将...
这个“图书管理系统”项目就是基于SSM框架实现的,它整合了Spring的强大功能、SpringMVC的优雅架构以及MyBatis的灵活数据库操作。 1. **Spring框架**:Spring是一个开源的Java平台,核心特性是依赖注入(Dependency...
在"基于SSM框架技术开发的图书管理系统"中,这三个框架各司其职,共同构建了一个高效、灵活的后台系统。 1. **Spring框架**:Spring作为核心容器,主要负责管理应用对象,通过依赖注入(DI)和面向切面编程(AOP)...
SSM图书信息管理系统是一个基于Java Web技术开发的项目,它整合了Spring、SpringMVC和MyBatis三个框架,这三者合称为SSM框架。这个系统主要用于管理和维护图书的相关信息,包括图书的添加、查询、修改和删除等操作,...
java开发基于SSM+Layui的图书管理系统源码。java开发基于SSM+Layui的图书管理系统源码。java开发基于SSM+Layui的图书管理系统源码。java开发基于SSM+Layui的图书管理系统源码。java开发基于SSM+Layui的图书管理系统...
总结,基于SSM的图书馆管理系统是一个综合性的项目,涵盖了Java Web开发的多个关键环节,对于学习和提升SSM框架的应用能力非常有帮助。同时,这样的系统在实际生活中也有着广泛的应用场景,是理论与实践结合的良好...
《基于SSM的图书管理系统详解》 SSM(Spring、SpringMVC、MyBatis)是Java企业级应用中常见的开发框架组合,以其轻量级、灵活和强大的特性深受开发者喜爱。本系统“基于SSM图书管理系统”便充分利用了这些优势,...
这个图书管理系统是一个典型的SSM应用实例,旨在帮助用户进行图书的增删查改操作,包括管理员对图书信息的管理以及读者的借阅查询等功能。下面将详细介绍这个项目中的关键知识点。 1. **Spring框架**:Spring是Java...
【SSM框架详解及其在图书借阅系统中的应用】 SSM框架是Java Web开发中常用的一种集成框架,由Spring、Spring MVC和MyBatis三个组件组成。本篇将详细介绍SSM框架的核心概念,并结合“基于SSM框架的图书借阅系统”这...
【ssm项目源码】图书馆管理系统.zip是一个包含Java Web开发中的SSM框架(Spring、SpringMVC、MyBatis)实现的图书馆管理系统的完整源代码。这个系统旨在提供全面的图书资源管理、用户借阅与归还、图书分类与检索等...
SSM在线图书销售系统是一个基于Java Web开发的项目,它采用了Spring、SpringMVC和Mybatis三大主流框架,以及Maven作为项目构建工具。这个系统主要用于实现图书的在线销售功能,包括用户管理、图书信息管理、订单处理...
基于SSM的大学图书角管理系统源码基于SSM的大学图书角管理系统源码基于SSM的大学图书角管理系统源码基于SSM的大学图书角管理系统源码基于SSM的大学图书角管理系统源码基于SSM的大学图书角管理系统源码基于SSM的大学...
《基于SSM框架的图书管理系统详解》 在JavaWeb开发领域,SSM框架(Spring、SpringMVC、MyBatis)是广泛使用的三大组件,它们的集成为开发提供了强大而灵活的支持。本项目"基于SSM框架图书管理系统"旨在帮助初学者...
基于SSM框架实现的图书管理系统源码+数据库.zip基于SSM框架实现的图书管理系统源码+数据库.zip基于SSM框架实现的图书管理系统源码+数据库.zip基于SSM框架实现的图书管理系统源码+数据库.zip基于SSM框架实现的图书...
协同过滤-图书馆图书推荐系统(JAVA,JSP,SSM,MYSQL)(毕业论文12544字,共34页,程序代码,MySQL数据库) 【运行环境】 Eclipse, IDEA JDK1.8(JDK1.7) Tomcat8(Tomcat7) 【技术栈】 JAVA, JSP, SSM, JQUERY, MYSQL, HTML, ...
基于SSM的图书管理系统源码基于SSM的图书管理系统源码基于SSM的图书管理系统源码基于SSM的图书管理系统源码基于SSM的图书管理系统源码基于SSM的图书管理系统源码基于SSM的图书管理系统源码基于SSM的图书管理系统源码...