Spring - ServletWebRequest.getHeaderValues ​​() не возвращает все заголовки - PullRequest
0 голосов
/ 29 января 2019

У меня настроена функция контроллера, вот так:

@RequestMapping(value = "/test/index.html", method = RequestMethod.GET)
public ModelAndView prepareView(HttpServletRequest request, @RequestHeader HttpHeaders header) 

Я получил исключение нулевого указателя из этого в

 org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver.resolveArgument(RequestHeaderMapMethodArgumentResolver.java:72) 

, поэтому я декомпилировал этот файл класса и прошел в отладкеРежим.Проблемный раздел кода выглядит следующим образом:

/* 70 */       for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {
/* 71 */         String headerName = (String)iterator.next();
/* 72 */         for (String headerValue : webRequest.getHeaderValues(headerName)) {
/* 73 */           result.add(headerName, headerValue);
/*    */         }
/*    */       }

webRequest - это объект типа NativeWebRequest.Таким образом, в строке 70 я вижу, что webRequest.getHeaderNames() возвращает заголовки запроса, которые я вижу, например, на вкладке Chrome Network.

Очевидно, балансировщик нагрузки (netscaler) вставляет некоторые заголовки после создания запроса(я назову это x-model), которое я не вижу в chrome.

Следуя этой трассировке, я вижу, что все стандартные RequestHeaders проходят и добавляются без проблем (то есть Accept, Cookie, Host и т. Д.).Однако в конечном итоге итератор в строке 70 достигает заголовка x-model.Затем в строке 72 вызывается webRequest.getHeaderValues('x-model'), и это возвращает ноль, поскольку заголовок с именем x-model не найден.Это вызывает нулевой указатель на расширенный foreach.

Почему существует несоответствие между тем, что возвращается ServletWebRequest.getHeaderNames() и ServletWebRequest.getHeaderValues(headerName)?Что я могу сделать, чтобы решить эту проблему?

Я заметил, что когда я смотрю на итератор, созданный в строке 70, появляется хэш-таблица набора ключей, содержащая [cookie, connection, accept-language, host, accept, user-agent, accept-encoding, referer, x-model, x-tenant, upgrade-insecure-requests].Однако запись таблицы не содержит записи для x-модели.Пожалуйста, смотрите прикрепленное изображение для двух объектов, к которым я обращаюсь

Я использую Java 7 и Spring 4.0.7

enter image description here

В чем разница между таблицей и начальным набором здесь?Почему набор записей содержит запись x-model, а таблица - нет?

1 Ответ

0 голосов
/ 30 января 2019

Таким образом, проблема была на самом деле в том, что кто-то добавил переопределение к HttpServletRequestWrapper.getHeaderNames(), которое используется пружиной для получения списка headernames для поддержки заголовка-обертки, который, но не переопределяет HttpServletRequestWrapper.getHeaders(), который используется пружиной для поисказначение заголовка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...