9

我正在尝试记录 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 + "}";
    }               
}
4

1 回答 1

21

也许您应该在您调用的地方发布代码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()也许直接在or中尝试一个非常简单的测试用例,比如我的doGet()/doPost()

于 2010-08-20T17:09:25.910 回答