Есть ли способ потерять httpservletrequest.getAttributenames () более одного раза?
-
30-09-2019 - |
Вопрос
Я пытаюсь зарегистрировать содержимое коллекции атрибутов 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()
.