+-
怎么了? Spring的@RequestBody byte [](长度比预期的长)怎么了?](/img/no_img.png)
我尝试使用@RequestBody byte []数据作为自动Base64解码器,以便接收一些RSA加密的数据,然后在我的服务中对其进行解密:
控制器:
@RequestMapping
void doIt(@RequestBody byte[] data) {
service.doIt(data);
}
服务:
void doIt(byte[] encryptedData) {
String testDataString = "hgLGtzF4D8tlJbVivQgaXXwfI9TbQ//PrYHEez5k93sqJSi17eLCa+r/cGNGvoxDRaPYONvP4yxW0ajKDFrusQ4V4owfhkijS9KzBOTjBeAVmA+5jBsZCdoxwCA65DiP5lJ+GRbn8CjcjCr4DaEWFbWHsyvY4NGGAQLuYv+PyZipfU9pXTEDsBb15NwaHlD5m7Z4CHWdWTt1ARvRaQs56Bp63/IEmGR7w4brA1+iuKPv83FLh0rsxyoJ+F8TeqtuPhm2fHTh1FiHn0Bpaqqoyd/cBl0/utSzu4qoZhB3AiVgLjnT6Iy9p5nVoAozxQo/Es59LrpGZfjYJer073jNIg==";
byte[] testDataBytes = Base64.decodeBase64(testDataString);
System.out.println(encryptedData.length);
System.out.println(testDataBytes.length);
System.out.println(new String(encryptedData).length());
System.out.println(Base64.encodeBase64String(testDataBytes).length());
System.out.println(new String(encryptedData).equals(Base64.encodeBase64String(testDataBytes)));
}
请求:
Content-Type: application/octet-stream
Request Payload:
hgLGtzF4D8tlJbVivQgaXXwfI9TbQ//PrYHEez5k93sqJSi17eLCa+r/cGNGvoxDRaPYONvP4yxW0ajKDFrusQ4V4owfhkijS9KzBOTjBeAVmA+5jBsZCdoxwCA65DiP5lJ+GRbn8CjcjCr4DaEWFbWHsyvY4NGGAQLuYv+PyZipfU9pXTEDsBb15NwaHlD5m7Z4CHWdWTt1ARvRaQs56Bp63/IEmGR7w4brA1+iuKPv83FLh0rsxyoJ+F8TeqtuPhm2fHTh1FiHn0Bpaqqoyd/cBl0/utSzu4qoZhB3AiVgLjnT6Iy9p5nVoAozxQo/Es59LrpGZfjYJer073jNIg==
输出:
(Spring) Byte length: 344
(test) Byte length: 256
(Spring) Base64 String length: 344
(test) Base64 String length: 344
Base64 String equals: true
如你看到的:
>该请求包含与我放入源代码中的测试数据完全相同的数据.
>在执行Base64编码后,两者的长度相同并且相等
>但是:字节数组的长度不同.
题:
为什么Spring生成的byte []更大? (当尝试使用某些RSA私钥对其进行解码时,它是没有用的,因为RSA期望长度为256.)
解决方法:
控制器:
@RequestMapping
void doIt(@RequestBody String data) {
service.doIt(Base64.decodeBase64(data));
}
最佳答案
在Spring的ByteArrayHttpMessageConverter中,您可以找到readInternal方法,该方法将请求的内容转换为所需的格式(在本例中为byte []).
代码(Spring 4.0.0.RELEASE):
long contentLength = inputMessage.getHeaders().getContentLength();
ByteArrayOutputStream bos = new ByteArrayOutputStream(contentLength >= 0 ? (int) contentLength : StreamUtils.BUFFER_SIZE);
StreamUtils.copy(inputMessage.getBody(), bos);
return bos.toByteArray();
第二行说:*如果请求有效载荷不为空,则取其内容长度,并以此设置ByteArrayOutputStream的容量.否则,如果内容长度为< 0,然后将其设置为StreamUtils.BUFFER_SIZE(= 4096).* 我不太确定为什么要以这种方式实现它,但是那才是实际的工作方式.
点击查看更多相关文章
转载注明原文:Spring的@RequestBody byte [](长度比预期的长)怎么了? - 乐贴网