Есть ли способ перебирать HttpServletRequest.getAttributeNames () более одного раза? - PullRequest
6 голосов
/ 20 августа 2010

Я пытаюсь зарегистрировать содержимое коллекции атрибутов HttpServletRequest. Мне нужно сделать это при первом запуске сервлета, и снова прямо перед завершением сервлета. Я делаю это, пытаясь понять грубого и плохо обслуживаемого сервлета. Поскольку мне нужно оказывать как можно меньшее влияние, фильтры сервлетов не подходят.

Так вот в чем проблема. Когда сервлет запустится, я переберу перечисление, возвращаемое HttpServletRequest.getAttributeNames (). Однако, когда я хочу повторить это снова, getAttributeNames (). HasMoreElements () возвращает «false»! Я не могу найти способ "сбросить" перечисление. Что еще хуже, даже если я добавлю атрибуты в коллекцию с помощью HttpServletRequest.setAttribute (), я все равно получу результат «ложь» при вызове getAttributeNames (). HasMoreElements ().

Это действительно возможно? Неужели нет способа перебрать имена атрибутов более одного раза?

По запросу вот мой код. Это довольно просто - не думайте, что я делаю какие-то забавные вещи.

/**
 * 
 * Returns the contents of the Attributes collection, formatted for the InterfaceTracker loglines
 * 
 */
@SuppressWarnings("unchecked")
public static String getAttributes(HttpServletRequest request) {
    try {       
        StringBuilder toLog = new StringBuilder();  

        Enumeration attributeNames = request.getAttributeNames();           

        while(attributeNames.hasMoreElements()) {
            String current = (String) attributeNames.nextElement();

            toLog.append(current + "=" + request.getAttribute(current));            

            if(attributeNames.hasMoreElements()) {
                toLog.append(", ");
            }           
        }       

        return "TRACKER_ATTRIBUTES={"+ toLog.toString() + "}";
    }
    catch (Exception ex) {
        return "TRACKER_ATTRIBUTES={" + InterfaceTrackerValues.DATA_UNKNOWN_EXCEPTION_THROWN + "}";
    }               
}

1 Ответ

18 голосов
/ 20 августа 2010

Возможно, вам следует разместить код, по которому вы звоните HttpServletRequest.setAttribute().

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

UPDATE

Ничто в вашем коде не показалось мне ошибочным ... поэтому я создал чрезвычайно простой тестовый пример внутри handleRequest() и развернул его (используя jboss-eap-4.3 в качестве моего контейнера). Сначала мне пришлось вручную установить атрибут, так как я понимаю, что атрибуты запроса всегда устанавливаются на стороне сервера (то есть, если я его не устанавливал, я не получал никакого вывода, поскольку Enumeration, возвращаемый getAttributeNames(), был пусто).

request.setAttribute("muckingwattrs", "Strange");

Enumeration attrs =  request.getAttributeNames();
while(attrs.hasMoreElements()) {
    System.out.println(attrs.nextElement());
}

System.out.println("----------------------------");

Enumeration attrs2 =  request.getAttributeNames();
while(attrs2.hasMoreElements()) {
    System.out.println(attrs2.nextElement());
}

выход

INFO  [STDOUT] muckingwattrs
INFO  [STDOUT] ----------------------------
INFO  [STDOUT] muckingwattrs

Так, возможно, ваш контейнер неправильно реализует getAttributeNames()? Может быть, попробуйте очень простой тестовый пример, такой как мой, прямо в handleRequest() или doGet()/doPost().

...