2016-08-31 6 views
-1

私はhttpのパスとメソッドのリストを持っています。例:URLは反復的に一致しません

私が理解しているように、着信要求があると、これらのパスは最初に一致したときに繰り返し比較されます。 私の質問は - パフォーマンスヒットですか? 1000の着信ルートを処理するサービスがある場合、パフォーマンスがどの程度低下するのでしょうか?

ヒットが少ない場合でも、URLとツリー/トライのようなマッチング戦略を一致させるための明確な戦略がありますか?はいの場合は、何ですか? 例: 着信URLを反復せずにこれらのいずれかに一致させたいとします。 例:いくつかのURLは、特別な治療を受ける場所GET/spaceshuttles/46のために、私はGET/spaceshuttles/{ID}

へのハンドルを取得する必要があります私は自分のWebアプリケーションフィルタのためにこれを必要とします。 現在、私は自分のリストを反復して試合をしています。私はすでに効率的なトライの方法でこれを行うライブラリがなければならないと仮定しています。

答えて

0

あなたのニーズに合ったライブラリはありません。私は、HTTPメソッドで正規表現パターンとHTTPメソッドまたはStringを保持するカスタムクラスRequestMatcherのために行くだろう:

class RequestMatcher { 
    private Pattern urlPattern; 
    private String httpMethod; 

    public RequestMatcher(final String urlPattern, final String httpMethod) { 
     this.urlPattern = Pattern.compile(urlPattern); 
     this.httpMethod = httpMethod; 
    } 

    public boolean matches(final String url, final String httpMethod) { 
     return httpMethod.equals(this.httpMethod) && this.urlPattern.matcher(url).matches(); 
    } 

あなたのフィルタでは、あなたがこのようにそれを使用することができます。

final RequestMatcher spaceShuttleMatcher = new RequestMatcher("/spaceshuttles/[0-9]+", "GET"); 
final RequestMatcher orderMatcher = new RequestMatcher("/[0-9]+\\.[0-9]+\\.[0-9]+/order", "POST"); 
boolean isSpaceShuttleRequest = spaceShuttleMatcher.matches("/spaceshuttles/123", "GET"); 
boolean isOrderMatcher = orderMatcher.matches("/1.2.3/order", "POST"); 
関連する問題