本文章备忘。后边研究透了来填坑,先写背景和解决方案。
背景:
原业务功能接口入参比较简单,所以使用的是 form-data格式作为入参。对业务做了扩展之后,入参的业务场景中有特殊符号,结果会查不到数据,经检查,是到服务端之后,被转义。
初步定位:
经过多方面排查,框架上有拦截器做了处理,请求头 使用的是:x-www-form-urlencoded ,所以到服务端之后,所以form-data的入参被转义了。
因为入参是form-data,前端vue使用 encodeURIComponent(uri) 处理的时候,也不行(可能是我使用的问题,如果有知道正确使用的,欢迎留言交流哈)
解决办法:
简化后的代码:
@ResponseBody
@RequestMapping("list")
public DemoRes list(@RequestParam(defaultValue = "1") int pageNumber,
@RequestParam(defaultValue = "20") int pageSize,
@RequestParam(name = "code", required = false) String code,
@RequestParam(name = "mame", required = false) String mame,
@RequestParam(name = "desc", required = false) String desc,
@RequestParam(name = "methodName", required = false) String methodName,
@RequestParam(name = "status", required = false) String status) {
log.info("入参,{},{}", methodName, code);
// ....业务逻辑部分
return null;
}
很简单,原接口只有页码 和 页数,后对接口拓展,为了改造最小化,没有调整对应的请求方式
方案一。
服务端针对包含特殊字符的字段处理,这样不治本。但是有效
代码如下:
@ResponseBody
@RequestMapping("list")
public DemoRes list(@RequestParam(defaultValue = "1") int pageNumber,
@RequestParam(defaultValue = "20") int pageSize,
@RequestParam(name = "code", required = false) String code,
@RequestParam(name = "mame", required = false) String mame,
@RequestParam(name = "desc", required = false) String desc,
@RequestParam(name = "methodName", required = false) String methodName,
@RequestParam(name = "status", required = false) String status) {
log.info("入参,{},{}", methodName, code);
if (StringUtils.isNotBlank(methodName)){
methodName= StringEscapeUtils.unescapeHtml4(methodName);
}
// ....业务逻辑部分
return null;
}
方案二。
改动多,需要前端和服务端同时调整,但是解决比较彻底。那就是把包含特殊字符的入参放到实体里边,请求入参方式改成 applicaiton/json
改造后的代码如下:
@ResponseBody
@RequestMapping("list")
public DemoRes list(@RequestParam(defaultValue = "1") int pageNumber,
@RequestParam(defaultValue = "20") int pageSize,
@RequestBody DemoReq request) {
// ....业务逻辑部分
return null;
}
@Data
public static class DemoRes implements Serializable {
private String name;
}
@Data
public static class DemoReq implements Serializable {
private String code;
private String mame;
private String desc;
private String methodName;
private String status;
}
这样入参中包含特殊字符也不会被转义。
以上是针对问题的解决办法,只知修复未知原因,还需深挖,暂留坑备忘,便于日后本人时间充裕,细细钻研其中奥义再来补充。