httpservletrequest.getattributenames()を介して反復する方法はありますか?
-
30-09-2019 - |
質問
httpservletrequest属性コレクションの内容を記録しようとしています。サーブレットが最初に起動したとき、そしてサーブレットが終了する直前に再びこれを行う必要があります。私はこれを行っており、cruftyで手入れされていないサーブレットを理解しようとしています。可能な限り影響を与えない必要があるため、サーブレットフィルターはオプションではありません。
これが問題です。サーブレットが起動すると、httpservletrequest.getattributenames()によって返される列挙を繰り返します。ただし、もう一度繰り返したい場合は、getattributeNames()。hasmoreElements()は「false」を返します。列挙を「リセット」する方法が見つかりません。さらに悪いことに、httpservletrequest.setattribute()を使用してコレクションに属性を追加しても、getattributeNames()を呼び出すと「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()
.
この時点で、あなたの2つの呼び出しの間に属性が削除されているように、あなたの2つの呼び出しの間に属性が削除されているように思われます 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()
.