У меня были странные проблемы, связанные с телами запросов / ответов в моем приложении, запущенном в Wildfly.Мне кажется, что буфер где-то совместно используется несколькими потоками, обслуживающими разные запросы.
Пример тела запроса, которое должно быть JSON, пришло из моего приложения:
{TTP/1.0 200 OK
Expires: 0
Cache-Control: max-age=7200
X-Powered-By: Undertow/1
Server: WildFly/10
X-XSS-Protection: 1; mode=block
Pragma:
X-Frame-Options: DENY
Accept-Ranges: bytes
Date: Fri, 07 Dec 2018 06:32:15 GMT
Connection: close
Last-Modified: Fri, 30 Nov 2018 17:08:34 GMT
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
Content-Length: 570
Content-Type: text/html; charset=UTF-8
"-","appliedMethods":[{"uuid":"ebe163d3-c14c-4664-96a1-de8be17d462b","method":{"guid":"631e552a-e86e-44dc-8f2f-14e5b9bafa63", ... normal JSON continues
КакВы можете видеть, что тело начинается с обычного {
символа, но затем оно переопределяется частью необработанного ответа от другого запроса, обслуживающего некоторый text/html
.
То же самое происходит с ответами,К сожалению, я не регистрирую ответы, поэтому все, что у меня есть, это изображение:
Тело ответа было частично переопределено другим ответом, только на этот раз первым символомтакже получил замену.
Мой стек:
- Клиент - angularjs 1.6.6
- Nginx - nginx-plus-r14-p1 (1.13.7)
- Wildfly - 10.1.0.Final
- Spring - 4.2.4.RELEASE
Другие наблюдения, которые у меня есть:
- Я могуизмерять только случаи с запросами, но частота появления этой проблемы крайне низка: 57 случаев из 37 806 125 сообщений, которые я в данный момент зарегистрировал.
- angularjs, похоже, не вызывает этого, потому что:
- У меня была такая же проблема с 1.4.
- Я почти уверен, что когда запрос переопределяется, та часть, с которой он переопределяется, принадлежит запросу другого клиента.Поскольку этот клиент не может иметь эти данные, он должен происходить дальше.
Насколько я знаю, в моем приложении нет "необычного кода", которыйможет вызвать такое поведение.
Единственное, что у меня есть, что выходит за рамки стандартных @Controller
вещей, - это RequestWrapper, который кэширует тела запросов для ведения журнала.Он почти идентичен org.springframework.web.util.ContentCachingRequestWrapper
и, конечно, не имеет доступа к ответам.
PS Похоже, этот вопрос касается той же проблемы.
ОБНОВЛЕНИЕ: Журналы Nginx доказанычто запросы приходят нормально от клиента.