application/x-www-form-urlencoded 中文参数乱码

现象:

springboot服务接口如下:

@PostMapping(value = "/v1/test")
public String handleBody(@RequestBody String body) {
    // TODO something
}

设置Header,"Content-Type: application/x-www-form-urlencoded;charset=utf-8",请求该接口,无论charset使用什么编码,或者接口设置编码decode都是乱码,URLDecoder.decode(body, "UTF-8")

原因:

springboot使用的undertow服务器,并且body内的中文没有进行URLEncoder.encode转码,而服务器中对字节直接强转为char类型导致,详细参考undertow-core包内的,io.undertow.server.handlers.form.FormEncodedDataDefinition。

private void doParse(StreamSourceChannel channel) throws IOException {
// ...
case 2:
	if (n == 38) {
	    this.data.add(this.name, this.builder.toString());
	    this.builder.setLength(0);
	    this.state = 0;
	} else {
	    if (n != 37 && n != 43) {
	        this.builder.append((char)n);
	        continue;
	    }

	    this.state = 3;
	    this.builder.append((char)n);
	}
	break;

// ...
}

https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/server/handlers/form/FormEncodedDataDefinition.java

参考:

  1. undertow服务器的中文乱码问题 - 简书
  2. Issue Navigator - Red Hat Issue Tracker
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值