2015-05-12 5 views
2

Я хотел бы повторить все доступные атрибуты в ServletRequest. Но почему-то при этом отображаются не все доступные атрибуты. Кажется, это происходит потому, что при запросе конкретного атрибута, который не был показан в перечислении, значение печатается правильно.Итерация через все атрибуты ServletRequest

Код для итерации атрибутов и для отображения конкретного свойства

HttpServletRequest request = this.getHttpServletRequest(); 
Enumeration en = request.getAttributeNames(); 
while (en.hasMoreElements()) 
{ 
    Object currentElem = en.nextElement(); 
    System.out.println("currentElem.getClass(): " + currentElem.getClass()); 
    System.out.println("currentElem.toString(): " + currentElem); 
} 
Object specificAttrValue = request.getAttribute("Shib-Identity-Provider"); 
System.out.println("\nspecific attr: " + specificAttrValue); 

Выхода:

currentElem.getClass(): класс java.lang.String
currentElem.toString(): corsFilter. FILTERED
currentElem.getClass(): класс java.lang.String
currentElem.toString(): org.springframework.web.context.request.RequestContextListener.REQUE ST_ATTRIBUTES
currentElem.getClass(): класс java.lang.String
currentElem.toString(): __spring_security_scpf_applied
currentElem.getClass(): класс java.lang.String
currentElem.toString(): __spring_security_session_mgmt_filter_applied
currentElem .getClass(): класс java.lang.String
currentElem.toString(): org.springframework.security.web.FilterChainProxy.APPLIED
currentElem.getClass(): класс java.lang.String
currentElem.toString (): __spring_security_filterSecurityInterceptor_filterApplied

конкретный атр: https://idp.testshib.org/idp/shibboleth

Почему итерации не показывать Shib-Identity-поставщика как доступный атрибут?

Как перебирать доступные атрибуты, которые являются «скрытыми»?

Примечание. Атрибуты, к которым я хотел бы получить доступ, устанавливаются поставщиком услуг Shibboleth. Сначала запрос отправляется на сервер Apache, затем в Shibboleth, а затем в Providerhib.org Identity Provider, обратно в Shibboleth и в зависимости от содержимого, которое запрос получает за счет некоторых атрибутов (это те, которые мне нужны для доступа), а затем попадает в сервлет Tomcat.

+1

'getAttributeNames()' фактически возвращает 'Перечисление ', используя это сделает ваш пример кода легче читать, т.е. отсутствие печати имен классов имен атрибутов (все равно все строки). –

+0

Я прочитал в Javadoc метода, что он возвращает перечисление строк, но при объявлении переменной как «Enumeration » компилятор предупреждает, что требуется непроверенное преобразование в String. – backendev

+0

Видимо, это происходит как для Tomcat, так и для Glassfish. Люди в списке Shibboleth, похоже, думают, что это ошибка: http://shibboleth.net/pipermail/users/2015-June/022260.html –

ответ

1

Если я вижу этот пост, который имеет ту же проблему: Retrieving Shibboleth attributes from AJP connector request

Это выглядит как getAttributeNames() этот контейнер не очень хорошо реализован по каким-то причинам и не возвращает все атрибуты

Эта ссылка может помочь также:

+0

Спасибо. Таким образом, три сообщения указывают, что получение атрибута непосредственно через имя работает, после того, как он сам его работает, но получение через Итерацию через все атрибуты не работает. Точно так же, как и вы, я бы также пришел к выводу, что, похоже, есть ошибка в getAttributeNames() контейнера. Я попытаюсь найти способ изменить это. Я приму свой ответ, если не найду его (я просто не хочу отказываться от надежды :)) – backendev

+0

Я действительно не знаю эту структуру, поэтому я не мог заключить, поскольку я ее не тестировал. Если бы я был вами, я бы внимательно посмотрел на вашу конфигурацию, поскольку это могло бы быть самым простым решением (на самом деле единственным). Тот факт, что getAttributeNames() не работает, на самом деле не является решением, но, скорее, ["features"] (http://fr.wiktionary.org/wiki/it%E2%80%99s_not_a_bug,_it%E2 % 80% 99s_a_feature) Shibboleth –

+0

У меня не было времени для дальнейшего изучения этой проблемы и использовалось обходное решение для передачи запроса вместо карты атрибутов, чтобы метод мог напрямую обращаться к запросу. Для всех, кто хочет дополнительно изучить этот вопрос, возможно, проверьте внутренние значения в используемом классе Request (в зависимости от Framework, был ли он для меня: http://grepcode.com/file/repo1.maven.org/maven2/org. apache.geronimo.ext.tomcat/catalina/7.0.39.2/org/apache/catalina/connector/RequestFacade.java # RequestFacade.getAttributeNames% 28% 29) и используемые суперклассы. Просто идея - также может быть тупиком. – backendev