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

StackOverflow https://stackoverflow.com/questions/3533009

Вопрос

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

Так вот проблема. Когда сервлет начинается, я перейду через перечисление, возвращаемое httpservletrequest.getAttributenames (). Однако, когда я хочу повторить это через него, Getattributenames (). Примерено () Возвращает "false"! Я не могу найти способ «сбросить» перечисление. Что хуже, даже если я добавлю атрибуты в коллекции, используя httpservletrequest.etatttribute (), я все еще получаю результат «ложного», когда я звоню GetAttributenames ().

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

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

/**
 * 
 * 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 + "}";
    }               
}
Это было полезно?

Решение

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

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

выход

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top