我正在尝试记录 HttpServletRequest 属性集合的内容。我需要在 servlet 首次启动时执行此操作,并且在 servlet 完成之前再次执行此操作。我这样做是为了理解一个粗鲁且维护不善的 servlet。因为我需要尽可能减少影响,所以 servlet 过滤器不是一个选项。
所以这就是问题所在。当 servlet 启动时,我将遍历 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 + "}";
}
}