質問

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().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top