gpt4 book ai didi

java - 有没有办法多次迭代 HttpServletRequest.getAttributeNames() ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:09 25 4
gpt4 key购买 nike

我正在尝试记录 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() 中尝试像我这样的极其简单的测试用例。

关于java - 有没有办法多次迭代 HttpServletRequest.getAttributeNames() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com