Это немного специфично: я использую схему bc tls psk для связи с SIM-картами, и она имеет несколько лет работал без сбоев, но теперь при обмене с определенными картами/устройствами полезная нагрузка, отправленная картой, недоступна в моем контроллере.
Я использую Springboot 2.5.15, Java 8, BC jdk8on 1.78.1.
Я взял трассировку tcpdump и вижу полезную нагрузку AF 80 23 11 .. .. 00 00 (сим-карта говорит так, пожалуйста, не судите их!).
Поэтому я не могу получить эту полезную нагрузку, хотя она присутствует в как трассировке TCP, так и в заголовке длины содержимого< /strong> скажите мне, что он там.
Вот скриншот TCPDUMP:
[img]https: //i.sstatic.net/DdBTJjw4.jpg[/img]
Мой контроллер:
Код: Выделить всё
public void anyRequest(@RequestHeader(value = CONTENT_TYPE, required = false) String requestContentType,
@RequestHeader(value = HEADER_X_ADMIN_PROTOCOL) String adminProtocol,
@RequestHeader(value = HEADER_X_ADMIN_FROM) String adminFrom,
@RequestHeader(value = HEADER_X_ADMIN_RESUME, required = false, defaultValue = "false") boolean adminResume,
@RequestHeader(value = HEADER_X_ADMIN_SCRIPT_STATUS, required = false) String adminScriptStatus,
@RequestBody(required = false) byte[] body, final HttpServletRequest request,
final HttpServletResponse response) throws InterruptedException, IOException {
Код: Выделить всё
Long contentLength = request.getContentLengthLong();
log.info("Request Content lenght in header: {}", contentLength);
if (body != null) {
log.info("body content {} ", Hex.encodeHexString(body));
}
Я даже пытался получить его несколькими другими способами, но безуспешно
Попытка 1:
Код: Выделить всё
if (body == null && contentLength > 0) {
log.warn("Body seems null while Content length Header is {} ", contentLength);
log.info("Trying alternative way to retreive the body {} ", contentLength);
InputStream is = request.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
body = buffer.toByteArray();
}
Код: Выделить всё
private byte[] alternateBodybytes(InputStream serveltInputStream, int contentLength) throws IOException {
byte[] bytes = new byte[contentLength];
for (int r, offset = 0; (r = serveltInputStream.read(bytes, offset, bytes.length - offset)) > -1;) {
offset += r;
}
return bytes;
}
- Есть ли есть ли другой способ получить необработанную полезную нагрузку, возможно, на более низком уровне стека в рамках Springboot?
- Я надеюсь, что мне не придется обновлять Spring/Java, так как это заставило бы меня много нужно сделать больше регрессии, но, возможно, пришло время.
Примечание. Ниже приведены TCP-трассировки транзакции, в которой мне удалось получить тело из тела @RequestBody(required = false) byte[], мне кажется, то же самое, да?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -http-body
Мобильная версия