Есть ли способ перебора HttpServletRequest.getAttributeNames () более одного раза?

Я ' Я пытаюсь записать содержимое коллекции атрибутов 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 + "}";
    }               
}
6
задан sangfroid 20 August 2010 в 17:15
поделиться

1 ответ

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

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

ОБНОВЛЕНИЕ

Ничто в вашем коде не кажется мне неисправным... поэтому я создал очень простой тестовый пример внутри 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());
}

output

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

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

18
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: