我正在尝试记录HttpServletRequest属性集合的内容。我需要在servlet第一次启动时执行此操作,然后在servlet完成之前再次执行此操作。我这样做是为了了解一个脆弱且维护不良的servlet。因为我需要影响尽可能小,所以servlet过滤器不是一个选择。

这就是问题所在。当servlet启动时,我将遍历HttpServletRequest.getAttributeNames()返回的枚举。但是,当我想再次遍历它时,getAttributeNames()。hasMoreElements()返回“false”!我找不到“重置”枚举的任何方法。更糟糕的是,即使我使用HttpServletRequest.setAttribute()将属性添加到集合中,当我调用getAttributeNames()。hasMoreElements()时,仍然会得到“false”的结果。

这真的有可能吗?真的没有办法多次遍历属性名称吗?

根据要求,这是我的代码。这很简单-不要以为我在做任何有趣的事情。

/**
 *
 * 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作为我的容器)。我必须先手动设置属性,因为我对请求属性的理解是它们总是在服务器端设置的(即,如果我未设置请求属性,那么由于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()中尝试一个非常简单的测试用例,例如我的。

10-04 18:27