2016-11-07 7 views
2

特定のWebリクエストに費やされた時間を操作名とともに記録するフィルタを作成したいとします。しかし、一部のURLにはパスパラメータがあり、URL自体ではなく特定のメソッドに対応するURLパターンを取得できるようなものを探しています。例えばHTTPフィルタからURLハンドラパターンにアクセスする

、私はGET /users/{}/accounts/{}代わりのように操作名を表示したい/users/{id}/accounts/{type}のようなURLの要求をGET処理するメソッドのために、言う:GET /users/1/accounts/facebookまたはGET /users/2/accounts/twitter?someParam=3

今私は、ログレコードを解析するツールでURLをあらかじめ定義されたパターンと照合して解決しますが、ハックのように見えます。

着信要求を処理するメソッドに関連付けられたURLパターンに簡単にアクセスする方法が見つかりませんでしたので、私は現在考えている解決策の1つは、コントローラメソッド自体にスレッドローカル変数を設定してアクセスすることです私のHTTPフィルタでは、これも解決するためのきれいな方法のようには見えません。

この問題の解決策はありますか?

は、いくつかのコンテキストを設定するには:私はSpring MVCの4

+1

フィルタがGenericFilterBeanを拡張している場合は、それをSpring Managedにすることができます。設定されたRequestMappingHandlerMappingのインスタンスを挿入することができます。これは、指定されたリクエストのマッピングを見つけるために必要と思われるものです。私はここから進める方法を考え出すことができませんでしたが、あなたに与えるかもしれないhttp://stackoverflow.com/questions/14025872/reflectively-getting-list-of-spring-mvc-controllers-matching-specific-urlを参照してくださいどのように一致するURLパターンを取得するかについてのいくつかのアイデア。 –

+1

OK、それを動作させる方法を見ているようです。私は、もし私が何か他のものに固執しない限り、私はこのコードでこのアプローチをとどめることに決めたら、私の質問を更新します。 – Alex

+0

@AlanHay私は答えを掲示した、それは私が望むよりもはるかに簡単であることが判明した。 – Alex

答えて

1

OKを使用している、それは超簡単であることが判明しました。次のように春で、あなたはそれを行うことができます。

public class HttpOperationLoggerFilter extends OncePerRequestFilter { 
    private final Logger log = LoggerFactory.getLogger(getClass()); 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
            HttpServletResponse response, 
            FilterChain filterChain) throws ServletException, IOException { 
     // do filter first 
     filterChain.doFilter(request, response); 

     // ... then you'll be able to access spring MVC's bestMatchingPattern! 
     final Object urlPattern = request 
     .getAttribute("org.springframework.web.servlet.HandlerMapping.bestMatchingPattern"); 
     log.info("urlPattern={}", urlPattern); 
    } 
} 

をので、あなたは「/ {その} /のように/ /行う{何か}」あなたはまさにそれを見ることができますようにURLパターンを扱うMVCコントローラのメソッドを持っている場合パターン!

この変数にはコンポジットパターンが含まれています。そのため、コントローラにRequestMappingアノテーションが付いている場合、その値はパターンの前に付加されます。

関連する問題