9

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

1 に答える 1

21

おそらく、呼び出す場所にコードを投稿する必要がありますHttpServletRequest.setAttribute()

この時点で、あなたの無愛想で手入れの行き届いていないサーブレットが への 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()

于 2010-08-20T17:09:25.910 に答える