最近前段在导出数据时会遇到“illegal character”的异常错误,结果发现是在请求地址中请求参数包含了空白字符(其编码为%C2%A0)或者是空格字符(其编码为%20),之前对空格字符情况是做了规避处理,而这次又出现了空白字符,要是后续还有其它特殊字符呢?那如何是好?难道每次遇到这些特使字符就在后端做特殊处理?这样显然不合适。既然后端对请求地址(包含请求参数)进行了非法校验(通过URBuilder类进行处理),那么目前只好将请求参数(我遇到的问题是下载的文件名称含有空格或空白字符)放置在请求体中了,这样就可以规避URBuilder的检查处理,在后端中从请求体中获取我想要的文件名称。
虽然,将文件名称从请求参数移动到请求体中,可以规避URBuilder对请求参数中含有非法字符的检验,但是前端所下载下来的文件名称还是不能正常显示空格或空白字符,都是这些特殊字符的编码形式。后端Java代码是使用了URLEncoder.encode()进行了UTF-8编码,由于后端的数据流还经过了BFF层,由于在BFF层又对编码过的字符再次进行了编码,导致在前段用JavaScript的decodeURIComponet()方法进行一次解码后仍旧显示的编码字符,因此需要进行多次解码才行,我这里是调用了三次decodeURIComponet()方法解码才能够正常显示文件名称了。
说明一下:在Java中用URLEncoder.encode()和URIDecoder.decode(),那么在JavaScript中需要采用decodeURIComponet()和encodeURIComponet()进行配对。
20191105 闪