EDIT: он был прав, был мешающий отладчик (Netbeans).
Клиент отправляет некоторые данные сервлету Spring Boot:
fetch("/command", {
method: 'POST',
cache: 'no-cache',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(...)
});
На стороне сервера HttpServletRequest.getReader()
возвращает строку <Unreadable>
(это точное написание и без каких-либо других ошибок или исключений) вместо строки JSON, отправленной клиентом. Точно то же самое происходит и с 'Content-Type': 'text/plain; charset=UTF-8'
. Строка JSON имеет размер около 150 КБ и на первый взгляд, зарегистрированная в консоли браузера перед отправкой, выглядит как однострочная строка JSON.
Для тестов я отправил содержимое текстового поля размером в несколько килобайт вместо строки JSON. На этот раз сервер без проблем получил идентичную строку. По какой-то причине может быть отправлена только строка JSON. Я проверил, помогает ли ограничение его размера. Как оказалось, это сработало:
body: JSON.stringify(...).substring(0,99999)
но это не так:
body: JSON.stringify(...).substring(0,100000)
Следующее:
body: new Blob( [ contentsCallback().substring(0, N) ], { type: 'application/json' } )
работает за 100000р. Этот:
const formData = new FormData();
formData.append('blob', new Blob( [ JSON.stringify(...).substring(0, N) ], { type: 'application/json' } ), 'test');
...
body: formData
работает для N‹99823.
Похоже, где-то есть ограничение по размеру. Я не знаю, на стороне клиента или на стороне сервера. Это фрагмент сервера application.properties
, где я поместил различные свойства, обсуждаемые здесь :
multipart.max-file-size=20MB
multipart.max-request-size=20MB
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB
multipart.maxFileSize=20Mb
multipart.maxRequestSize=20Mb
server.tomcat.max-http-post-size=10000000
server.tomcat.max-http-post-size=100000000
server.tomcat.max-swallow-size=100000000
Вот как регистрируется сервлет:
@Bean
public ServletRegistrationBean commandRegistration() {
ServletRegistrationBean bean = new ServletRegistrationBean(
new CommandServlet(), "/command");
// final int SIZE_LIMIT = 20000000;
// MultipartConfigElement mc = new MultipartConfigElement(TMP_FOLDER,
// SIZE_LIMIT, SIZE_LIMIT * 2, SIZE_LIMIT / 2);
// bean.setMultipartConfig(mc);
return bean;
}
Раскомментирование закомментированной части не меняет рассматриваемый предел.
Вот данные Chrome для fetch(), которая отправляет полные 150 КБ JSON (полученные как <Unreadable>
):
Request URL: https://localhost:8443/?command=save
Request Method: POST
Status Code: 200
Remote Address: [::1]:8443
Referrer Policy: strict-origin-when-cross-origin
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Content-Length: 0
Content-Type: text/html;charset=UTF-8
Date: Thu, 18 Mar 2021 09:32:00 GMT
Expires: 0
Keep-Alive: timeout=60
Pragma: no-cache
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pl;q=0.8,de;q=0.7,fr;q=0.6,ru;q=0.5,es;q=0.4,nl;q=0.3,cs;q=0.2,it;q=0.1,nb;q=0.1
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 146111
Content-Type: application/json
Cookie: JSESSIONID=961B41156DCF6F7C57455AA871525198; JSESSIONID=72CCDD7A91C48660B9DD01041F4BEFBB
Host: localhost:8443
Origin: https://localhost:8443
Pragma: no-cache
Referer: https://localhost:8443/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36
command: save
В журнале консоли нет ни ошибок, ни предупреждений. Ограничение присутствует также при использовании Firefox или при переключении HTTP-сервера с Tomcat на Jetty.
Наконец, я просмотрел все исходники и все jar-файлы (включая зависимости в локальном репозитории Maven) на наличие <Unreadable>
. Строка не может быть найдена там.
Можно ли увеличить этот лимит? Как отправить большую строку в приложение SpringBoot с помощью метода POST? Эти ответы предполагают, что практические ограничения для POST намного превышают 100 КБ.
<unreadable>
, был отладчик gdb... так что у вас нет никаких инструментов отладки, мешающих вашему программному обеспечению? - person eis   schedule 18.03.2021https://localhost:8443
, браузер (Chrome или FIrefox) находится в той же локальной системе. Система — Linux Mint, производная от Ubuntu 18.04. Я никогда не устанавливал здесь ни антивирус, ни впн и даже не перенастраивал iptables, но кто его знает. - person scriptfoo   schedule 18.03.2021<Unreadable>
, т.е. начинается с заглавной буквы. - person scriptfoo   schedule 18.03.2021nc -l portnumber
с номером порта, с которым вы использовали свой java-сервер, нажмите запрос и посмотрите, что произойдет. - person eis   schedule 18.03.2021<unreadable>
в другом отладчике. Возможно, некоторая (культурная) зависимость между этими двумя приложениями. - person scriptfoo   schedule 18.03.2021fetch
, потому что мои знания Javascript ограничены. - person scriptfoo   schedule 18.03.2021