spring - Spring 的 @RequestBody byte[](长度大于预期)有什么问题?

标签 spring spring-mvc base64 bytearray converter

我尝试使用 @RequestBody byte[] data作为自动 Base64 解码器,为了接收一些 RSA 加密数据,然后在我的服务中解密它:

Controller :

@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 编码后,两者长度相同且“相等”
  • 但是:字节数组的长度不同。

  • 题:

    为什么是byte[]那是由Spring生成的更大? (尝试使用某些 RSA 私钥对其进行解码时是无用的,因为 RSA 期望长度为 256。)

    解决方法:

    Controller :
    @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 - Spring 的 @RequestBody byte[](长度大于预期)有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21360150/

    相关文章:

    spring - 注册过滤器时 "addMappingForServletNames()"的含义是什么?

    spring-mvc - 如何在spring-boot中拦截嵌入式Tomcat上的 "global"404s

    java - Spring MVC在jsp页面导入css和js

    java - 测试 WebSecurityConfigurerAdapter

    base64 - 编码/解码base64

    javascript - 在 JavaScript 中将 Blob 转换为 Base64

    java - JMS 监听器中出现异常时重新传递 JMS 消息

    mysql - 数据库连接未关闭

    email - 是否在76之后是RFC 2045所定义的MIME节的行长限制?

    java - Spring boot 中的字段是否有 'must be numerical' 验证符号?