2

HttpServletリクエストで問題が発生しています。リクエストヘッダーを取得するアプリケーションがあります。アプリケーションが重複するヘッダー名を検出した場合、エラーをスローすることになっています。ただし、少しグーグルした後、HttpServletRequest重複するヘッダー名を無視し、最初に検出したヘッダー名の取得に進むことがわかりました。それらの重複するリクエストヘッダーをキャッチするために私ができることはありますか?

アプリケーションコンテナとしてTomcat6を使用しています。

これはコードです:

int headerChecker=0;
for(Enumeration<String>names = request.getHeaderNames(); names.hasMoreElements(); ) {
    String name = (String)names.nextElement();
    if(name.equalsIgnoreCase("abcd")){
        headerChecker++; // add 1 to headerChecker if abcd header is encountered
    }
    for(Enumeration<String>values = request.getHeaders(name); values.hasMoreElements(); ) {
        String value=(String)values.nextElement();
        System.out.println("name: "+name+"\tvalue: "+value);
        }
    }

    if(headerChecker! = 1){
        logger.error("abcd is duplicated, returning HTTP 404");
    } else {
        //...proceed with application
    }
}

ログは次のとおりです。

name:  host   value: localhost:8080  name: user-agent value:
CocoaRestClient/8 CFNetwork/520.4.3 Darwin/11.4.2 (x86_64)
(MacBookPro9%2C2)  name: content-length value: 23  name: accept   value:

**name: abcd  value: 1234556**  name: accept-language value: en-us  name: accept-encoding value: gzip, deflate  name: content-type    value:
application/x-www-form-urlencoded  name: connection value: keep-alive

これはテストのスクリーンショットです:

ここに画像の説明を入力してください

編集:これがサーブレットです

public class HeaderServlet extends HttpServlet
{
public void doPost(HttpServletRequest req, HttpServletResponse res)
{
    doGet(req, res);
}

public void doGet(HttpServletRequest req, HttpServletResponse res)
{
int xmsisdnChecker = 0;
String value = "";  
for(Enumeration<String> names = req.getHeaderNames();names.hasMoreElements();){
    String name = (String) names.nextElement(); 
    Enumeration<String> values = req.getHeaders(name);
    if(values != null)
    {
        while(values.hasMoreElements()) {
            if(name.equalsIgnoreCase("abcd"))
            {
                xmsisdnChecker++;
                System.out.println("ee: " + xmsisdnChecker) ;
            }

            value = (String) values.nextElement();

            System.out.println("header name: " + name + "\theader value: " + value);
        }

    }   
  }
}   
}
4

2 に答える 2

7

いいえ、重複するヘッダーを無視HttpServletRequestしません-それらを収集します。

からHttpServletRequest.getHeaders(String)

指定されたリクエストヘッダーのすべての値を文字列オブジェクトの列挙として返します。

Accept-Languageなどの一部のヘッダーは、コンマ区切りのリストとして送信するのではなく、それぞれが異なる値を持つ複数のヘッダーとしてクライアントから送信できます。

getHeaderNames()したがって、存在するすべてのヘッダーを取得するために呼び出す必要があるように思えます。次にgetHeaders(String)、それぞれの名前で呼び出し、返された列挙に複数のエントリがあるかどうかを確認します。

于 2012-09-29T11:13:25.770 に答える
1

あなたの増分は間違った場所にあります。HttpServletRequestすべての値をまとめて収集し、単一のヘッダーの複数の値として表示します。headerChecker値をループする内側のループ内でテストしてインクリメントする必要があります。外側のループは「abcd」に1回だけ遭遇します。

于 2012-09-29T12:51:25.187 に答える