记一次RequestBodyAdvice加解密,Header未重置Content-length的血泪史

前置工作:

大概就是实现RequestBodyAdvice,对请求报文先进行解密。如何实现,大家可以自行百度。

错误原因:

由于我们项目是用的公司自己的框架,在原生的spring boot 作了很多封装。当我在RequestBodyAdvice中解密完后,没有对Header头“Content-length”进行重置——重新计算解密后的Byte.length,然后赋值。导致了后面请求总是报输入流读取错误。

修改之前的解密后的代码截取片段:

InputStream inputStream = IOUtils.toInputStream(decryptBody, config.getEncoding());
DecryptHttpInputMessage decryptHttpInputMessage = new DecryptHttpInputMessage(inputStream, inputMessage.getHeaders());

大概解决方式:

重新计算header中的content-length:


inputMessage.getHeaders().set(HttpHeaders.CONTENT_LENGTH, String.valueOf(bodyBytes.length));
InputStream inputStream = IOUtils.toInputStream(decryptBody, config.getEncoding());
byte[] bodyBytes = decryptBody.getBytes();
inputMessage.getHeaders().set(HttpHeaders.CONTENT_LENGTH, String.valueOf(bodyBytes.length));
DecryptHttpInputMessage decryptHttpInputMessage = new DecryptHttpInputMessage(inputStream, inputMessage.getHeaders());

其中 DecryptHttpInputMessage

@NoArgsConstructor
@AllArgsConstructor
public class DecryptHttpInputMessage implements HttpInputMessage {

    private InputStream body;

    private HttpHeaders headers;

    @Override
    public InputStream getBody() throws IOException {
        return body;
    }

    @Override
    public HttpHeaders getHeaders() {
        return headers;
    }
}

总结:大家多body进行了操作之后,如果要保证后续读取正常,务必重新计算 Header头“Content-length”

你可能感兴趣的:(spring,boot,java,spring,boot,spring)