HttpServletRequest 属性コレクションの内容をログに記録しようとしています。これは、サーブレットが最初に起動したときと、サーブレットが終了する直前に行う必要があります。私は、無愛想で手入れの行き届いていないサーブレットを理解しようとしてこれを行っています。できるだけ影響を少なくする必要があるため、サーブレット フィルターはオプションではありません。
ここで問題です。サーブレットが開始したら、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 + "}";
}
}