AJAX设置content-type为:application/json提交参数后台接收参数的问题

本文探讨了前后端开发中常见的Ajax请求与SpringBoot后端参数接收不匹配的问题,特别是当前端设置content-type为application/json时,后端如何正确接收和解析数据。文章提供了传统流方式和@RequestBody注解两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我一直做java的,对前端说不上有多了解,以前遇到的前端的开发人员,包括我自己再写ajax的时候基本上都是以下写法:

$('#send').click(function(){
         $.ajax({
			 headers:{
				Authorization : "Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVa1p1dEsxQm1PX2p3V09WVDJlbk16Z2piaHljZm1Ld0RiRkV1Q1RhdjY0In0.eyJqdGkiOiI1YzA2ZTk3NS1hNDRjLTRhMzctYmMyNy1hNDlhYzlhODc2MDMiLCJleHAiOjE1NDE1OTExNzMsIm5iZiI6MCwiaWF0IjoxNTQxNTkwMjczLCJpc3MiOiJodHRwczovL2Rldi54dWViYXN0dWR5LmNvbS9hdXRoL3JlYWxtcy9zYXRvIiwiYXVkIjoic2FsZXMtY2xpZW50Iiwic3ViIjoiN2Q0ODIxMDgtM2UzNi00OThmLWEyODAtYjE0YjhmMGJlN2ZkIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoic2FsZXMtY2xpZW50Iiwibm9uY2UiOiJlYzFhNGIxMy04ZWZhLTQ1MTQtODkyZC1mNmU0ODkyZmNmNmYiLCJhdXRoX3RpbWUiOjE1NDE1OTAyNTMsInNlc3Npb25fc3RhdGUiOiIwMDEyNmUzYS1jODcxLTRjZWYtYTg4Ni1hZDY0YTc1YWMyY2MiLCJhY3IiOiIwIiwiY2xpZW50X3Nlc3Npb24iOiI0YTA2NTY0YS04Yzg4LTRkYjgtOTNlOS04OWI4MTBiY2FjODIiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiwiaHR0cDovLzE5Mi4xNjguMC4yIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJTYWxlcyIsIlRlYWNoZXJzIiwiU2FsZUFkbWluIiwiVGVhY2hlckFkbWluIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJzYXRvLW5vdGlmaWNhdGlvbiI6eyJyb2xlcyI6WyJUZWFjaGVycyIsIlNhbGVzIiwiU2FsZUFkbWluIiwiVGVhY2hlckFkbWluIl19LCJzYWxlcy1jcm0iOnsicm9sZXMiOlsiU2FsZXMiLCJTYWxlQWRtaW4iXX0sInNhbGVzLWxlYWRzLWh0dHAiOnsicm9sZXMiOlsiU2FsZXMiXX0sImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJ2aWV3LXByb2ZpbGUiXX19LCJuYW1lIjoi6ZSA5ZSuIDAxIiwicHJlZmVycmVkX3VzZXJuYW1lIjoic2FsZXMwMSIsImdpdmVuX25hbWUiOiLplIDllK4iLCJmYW1pbHlfbmFtZSI6IjAxIn0.TyqgUCost9sDy-tE8KAPW_3tBbTnzm6xfgIY2c1FhEYR3-mfLLbh0LLdkqDJEMs9AIvElOyU1jf9YA4laA6imaNqAshPvrRhxh4wIqJ9cCTNJjrou98gxkccRSSaFX19VctxLxRGk1wC_ZlIqdg9rgklVJE1rpDpzOnm1WF-skSwoQI7UZINEeizVZC21T4eIvDLoWUU6Qp9LKW3kcahU0k44S2v1k-lMJzE8dD4rQco7Z1vswXvYOxpk5g-RPKiREo1je-ZGyZLXZiJPdLwIm7mGp1x6qOxIUnbrMZk24VwS48hBhbbKeahBS-lvfEck0vLls3EVL0JMx9gre3Jbg"
			 },
             type: "POST",
             url: "https://dev.xuebastudy.com/crm-cti/userDetail",
             data: {
					"id":"4",
					"customerNumber":"13315863006",
					"customerId":"test",
					"salesId":4
				   },
             dataType: "json",
             success: function(data){
				alert(JSON.stringify(data))
             }
         });
    });

所以后台在接收参数的时候也习惯了 request.getParameter(),或者使用@RequestParam的注解的方式。

这样是没有问题的,因为这种方式提交的时候他的请求头如下

但是新公司的前端,喜欢使用使用$.ajax(url,data,callback)的方式发起ajax,并且设定了content-type为 application/json。但是在Post的时候,我后台居然接受不到参数,瞬间一脸懵逼。

使用POSTMan模拟下情况如下

查看ajax的请求代码如下:

 

对于这种方式,如果没有使用框架的情况下,只能采用传统的流的方式接收:


    private String getXmlString(HttpServletRequest request) {
        BufferedReader reader = null;
        String line = "";
        String xmlString = null;
        try {
            reader = request.getReader();
            StringBuffer inputString = new StringBuffer();

            while ((line = reader.readLine()) != null) {
                inputString.append(line);
            }
            xmlString = inputString.toString();
        } catch (Exception e) {
//            throw new YppException(PayException.xmlParseError);
        }
        return xmlString;
    }

但是在spring boot的中可以使用@RequestBody加上对象接收

@RequestBody ParamUserDetail userDetail

当然如果不愿意构造对象的时候可以使用Map<String,String>来接收,对于少量参数建议使用这种方式

@RequestBody Map<String,String> params

 

<think>好的,我现在需要解决用户提出的SpringMVC后台接收POST请求时中文参数出现乱码的问题。用户提到了关于Content-Typeapplication/x-www-form-urlencoded;charset=UTF-8的情况,这可能与请求的编码设置有关。我需要结合提供的引用资料,分析可能的原因和解决方案。 首先,根据引用[2],当使用POST方式发送数据且Content-Typeapplication/x-www-form-urlencoded时,数据是以键值对形式发送的,比如key1=value1&key2=value2。这时候,如果数据中包含中文字符,字符编码是否正确设置就非常重要。如果前端没有正确指定charset为UTF-8,或者后端没有正确解析,就可能导致乱码。 接着,引用[5]提到在前端AJAX请求中设置contentType为"application/json"可以解决某些问题,但用户的情况是使用application/x-www-form-urlencoded,可能需要不同的处理方式。不过这里的关键是确保前后端编码一致,都是UTF-8。 然后,引用[3]和[4]指出SpringMVC报错是因为不支持特定的Content-Type,但用户的问题不是报错,而是乱码。这说明可能配置有误,或者字符编码过滤器未正确设置。 通常,SpringMVC中解决POST请求乱码问题需要配置字符编码过滤器,比如CharacterEncodingFilter,并设置encoding为UTF-8,同时forceEncoding为true。这可以确保请求和响应都使用UTF-8编码。引用[5]中的前端设置contentTypeapplication/json可能改变了数据格式,但用户的情况是使用application/x-www-form-urlencoded,所以可能需要检查过滤器的配置是否正确。 另外,还需要检查服务器的配置,比如Tomcat的server.xml中的URIEncoding是否设置为UTF-8,确保容器级别的编码正确。同时,检查前端页面或请求是否明确指定了charset为UTF-8,比如在表单或AJAX请求中设置。 可能的步骤包括: 1. 确认Spring的CharacterEncodingFilter已配置,并且forceEncoding设置为true。 2. 检查前端请求是否明确使用UTF-8编码,比如在AJAX设置contentTypeapplication/x-www-form-urlencoded; charset=UTF-8。 3. 确保应用服务器(如Tomcat)的URI编码设置为UTF-8。 4. 使用拦截器或过滤器打印请求参数,查看是否在到达控制器之前就已经乱码,以确定问题发生的环节。 如果以上配置都正确,但问题仍然存在,可能需要进一步调试,比如检查是否有其他过滤器覆盖了编码设置,或者请求头中的其他设置导致问题。</think>要解决SpringMVC后台接收POST请求时中文参数乱码的问题,需从请求编码配置、过滤器设置及服务器参数三方面入手。以下是具体步骤: --- ### **1. 配置Spring字符编码过滤器** 在`web.xml`中添加`CharacterEncodingFilter`并强制使用UTF-8编码: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> <!-- 强制请求和响应均使用UTF-8 --> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 此过滤器会强制将请求和响应的编码设置为UTF-8[^2][^5]。 --- ### **2. 前端请求明确指定编码** 若使用AJAX发送POST请求,需在`contentType`中指定字符集: ```javascript $.ajax({ url: "your_url", type: "POST", data: { param: "中文参数" }, contentType: "application/x-www-form-urlencoded; charset=UTF-8", // 明确指定编码 success: function(response) { /* ... */ } }); ``` 确保前端请求头的`Content-Type`包含`charset=UTF-8`[^2]。 --- ### **3. 检查应用服务器编码配置** 在Tomcat的`server.xml`中,配置`<Connector>`的`URIEncoding`属性: ```xml <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" <!-- 确保容器解析URL时使用UTF-8 --> connectionTimeout="20000" redirectPort="8443" /> ``` 此配置避免服务器解码参数时出现乱码[^2][^4]。 --- ### **4. 验证请求编码** 在Controller中添加调试代码,检查参数是否已乱码: ```java @RequestMapping("/test") public void testController(@RequestParam String param, HttpServletRequest request) { System.out.println("接收参数原始值: " + param); System.out.println("请求编码: " + request.getCharacterEncoding()); } ``` 若输出仍为乱码,需排查过滤器是否被其他配置覆盖[^4]。 --- ### **常见问题原因** 1. **缺失字符编码过滤器**:未配置`CharacterEncodingFilter`或未强制编码。 2. **前端未指定编码**:AJAX或表单未明确声明`charset=UTF-8`。 3. **服务器默认编码错误**:Tomcat等容器使用ISO-8859-1解码参数--- ### **相关问题** 1. 如何配置SpringMVC支持多种Content-Type(如JSON、表单)? 2. Tomcat服务器如何处理URL编码? 3. Spring中如何自定义过滤器解决特定编码问题--- 通过以上步骤,可系统性解决POST请求中文乱码问题。若仍无效,需检查中间件(如Nginx)或数据库连接的编码设置是否一致。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值