Java 有没有办法不止一次迭代 HttpServletRequest.getAttributeNames() ?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3533009/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 01:37:16  来源:igfitidea点击:

Is there a way to iterate through HttpServletRequest.getAttributeNames() more than once?

javaattributesenumerationservletsenumerator

提问by sangfroid

I'm trying to log the contents of the HttpServletRequest attributes collection. I need to do this when the servlet first starts, and again right before the servlet is finished. I'm doing this in an attempt to understand a crufty and ill-maintained servlet. Because I need to have as little impact as possible, servlet filters are not an option.

我正在尝试记录 HttpServletRequest 属性集合的内容。我需要在 servlet 首次启动时执行此操作,并在 servlet 完成之前再次执行此操作。我这样做是为了理解一个粗暴且维护不善的 servlet。因为我需要尽可能少的影响,servlet 过滤器不是一个选项。

So here's the problem. When the servlet starts, I'll iterate through the enumeration returned by HttpServletRequest.getAttributeNames(). However, when I want to iterate through it again, getAttributeNames().hasMoreElements() returns "false"! I can't find any way to "reset" the enumeration. What's worse is that, even if I add attributes to the collection using HttpServletRequest.setAttribute(), I still get a result of "false" when I call getAttributeNames().hasMoreElements().

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

Is this really possible? Is there really no way to iterate through the attribute names more than once?

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

By request, here's my code. It's pretty straightforward -- don't think I'm doing any funny stuff.

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

/**
 * 
 * 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 + "}";
    }               
}

采纳答案by new Thrall

Perhaps you should post the code where you call HttpServletRequest.setAttribute().

也许你应该在你调用的地方发布代码HttpServletRequest.setAttribute()

At this point it would seem that your crufty and ill-maintained servlet is removing attributes between your two calls to getAttributeNames(), but without any code samples it's hard to say.

在这一点上,您的粗暴且维护不良的 servlet 似乎正在删除您对 的两次调用之间的属性getAttributeNames(),但如果没有任何代码示例,则很难说。

UPDATE

更新

Nothing in your code is jumping out at me as being faulty... so I crafted an extremely simple test case inside handleRequest()and gave it a whirl (using jboss-eap-4.3 as my container). I had to manually set an attribute first, as my understanding of request attributes is they are always set server side (i.e. if I didn't set it then I didn't get any output as the Enumerationreturned by getAttributeNames()was empty).

您的代码中没有任何内容是错误的……所以我在里面制作了一个非常简单的测试用例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());
}

output

输出

INFO  [STDOUT] muckingwattrs
INFO  [STDOUT] ----------------------------
INFO  [STDOUT] muckingwattrs

So perhaps your container doesn't implement getAttributeNames()correctly? Maybe try an extremely simple test case like mine directly in handleRequest()or doGet()/doPost().

那么也许您的容器没有getAttributeNames()正确实现?也许直接在handleRequest()或 中尝试像我这样的极其简单的测试用例doGet()/doPost()