Java 有没有一种方法可以多次迭代HttpServletRequest.getAttributeNames()呢?
我正在尝试记录HttpServletRequest属性集合的内容。我需要在servlet第一次启动时执行此操作,然后在servlet完成之前再次执行此操作。我这样做是为了理解一个粗糙且维护不当的servlet。因为我需要尽可能少的影响,所以servlet过滤器不是一个选项 这就是问题所在。当servlet启动时,我将遍历HttpServletRequest.getAttributeNames()返回的枚举。但是,当我想再次遍历它时,getAttributeNames().hasMoreElements()返回“false”!我找不到任何方法“重置”枚举。更糟糕的是,即使我使用HttpServletRequest.setAttribute()向集合添加属性,调用getAttributeNames().hasMoreElements()时仍然会得到“false”的结果 这真的有可能吗?真的没有办法对属性名称进行多次迭代吗 根据要求,这是我的代码。这很简单,别以为我在做什么有趣的事Java 有没有一种方法可以多次迭代HttpServletRequest.getAttributeNames()呢?,java,attributes,enumeration,servlets,enumerator,Java,Attributes,Enumeration,Servlets,Enumerator,我正在尝试记录HttpServletRequest属性集合的内容。我需要在servlet第一次启动时执行此操作,然后在servlet完成之前再次执行此操作。我这样做是为了理解一个粗糙且维护不当的servlet。因为我需要尽可能少的影响,所以servlet过滤器不是一个选项 这就是问题所在。当servlet启动时,我将遍历HttpServletRequest.getAttributeNames()返回的枚举。但是,当我想再次遍历它时,getAttributeNames().hasMoreEleme
/**
*
* 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()
的地方发布代码
在这一点上,您粗糙且维护不好的servlet似乎正在删除对getAttributeNames()
的两次调用之间的属性,但是如果没有任何代码示例,就很难说了
更新
你的代码中没有任何东西会因为我的错误而跳出来。。。因此,我在handleRequest()
中构建了一个极其简单的测试用例,并对其进行了测试(使用jboss-eap-4.3作为容器)。我必须首先手动设置一个属性,因为我对请求属性的理解是,它们总是在服务器端设置的(即,如果我没有设置它,那么我就没有得到任何输出,因为getAttributeNames()
返回的枚举
是空的)
输出
INFO [STDOUT] muckingwattrs
INFO [STDOUT] ----------------------------
INFO [STDOUT] muckingwattrs
因此,您的容器可能没有正确实现
getAttributeNames()
?也许可以直接在handleRequest()
或doGet()/doPost()
中尝试一个像我这样非常简单的测试用例,谢谢你的帮助,但我知道这不是servlet的错。作为测试,我尝试在迭代集合之后,在同一个函数中向集合添加属性。尽管如此,hasMoreElements()返回为false。也许您没有第二次回调GetAttributeName,这就是为什么完整示例会很有趣的原因。还有,您使用哪个servlet容器?好的,我发现了我的问题。我觉得有点傻,因为这个问题与HttpServletRequest无关。我最终注意到,我只是在单元测试中遇到了这个问题,而不是在实际运行servlet时。事实证明,我用错了Mockito。因此,尽管您无法找到我的问题的根本原因,但您确实帮助我排除了HttpServletRequest的可能性。谢谢!通常不是这样吗?:)很高兴我们能帮忙(即使是间接的)!所以您在服务开始时调用getAttributes方法/doGet/doPost方法,然后在结束时再次调用它,rite?Downvoting,因为这只是一个用户错误。
INFO [STDOUT] muckingwattrs
INFO [STDOUT] ----------------------------
INFO [STDOUT] muckingwattrs