Почему ServletRequest getAttribute () имеет другие атрибуты, чем getAttributeNames ()? - PullRequest
1 голос
/ 07 сентября 2011

Мы запускаем Apache перед Tomcat и используем mod_jk. Наш модуль единого входа Apache устанавливает информацию о пользователе, которую мы можем получить в Java с помощью вызова getAttribute () .

String mobileNumber = request.getAttribute("WEBAUTH_LDAP_MOBILE");

Это отлично работает. Теперь я хотел получить все атрибуты и найти те, которые названы с префиксом "WEBAUTH_LDAP_". Для этого я использовал getAttributeNames () .

Enumeration<String> enumeration = request.getAttributeNames();

чтобы получить имена атрибутов. К моему удивлению, нет атрибута с именем "WEBAUTH_LDAP_MOBILE". Это ожидается? Есть ли способ получить все атрибуты? JavaDoc делает его похожим на то, что в getAttribute () должно быть также в getAttributeNames ().

Мы используем Tomcat 6.0.28.

1 Ответ

1 голос
/ 07 сентября 2011

Это связано с тем, что любые атрибуты, установленные с помощью mod_jk, доступны с getAttribute(), но не с помощью getAttributeNames(). Согласно документации

Вы можете получить переменные в Tomcat как атрибуты запроса через request.getAttribute (имя_атрибут). Обратите внимание, что переменные отправляются через JkEnvVar не будет указан в request.getAttributeNames ().

Я отлаживал все RequestWrappers (согласно предложению BalusC), а базовый запрос имеет внутреннюю карту атрибутов, которые используются для getAttributeNames(). Однако у getAttribute() есть провал к другому объекту, когда значение внутренней карты равно нулю. Из Javadoc и документации, это работает как задумано.

Это поведение ранее сообщалось как ошибка , но исправление не проходит тест TCK:

Я рассмотрел только включение всех внутренних атрибутов Tomcat в ответ из getAttributeNames (), но это вызывает проблемы с сервлетом 2.5 TCK тесты, которые ожидают, что getAttributeNames () возвращает только те атрибуты, которые были установлены через setAttribute ().

Короче говоря, getAttributeNames() вернет атрибуты, установленные с помощью setAttribute(), тогда как getAttribute() может вернуть атрибуты, установленные с помощью различных других (внутренних) средств.

...