2

クエリ文字列の既知のリストを厳密に受け入れるように Spring-MVC を構成する方法はありますか? 送信されたクエリ文字列を検証しようとしています。リクエストに追加のクエリ文字列パラメーターがある場合は、それについて知り、404 を返したいです。

私の動機は次のとおりです。

  • 明快さ: 私は、クライアントが要求パラメーターをファットフィンガー化して、それでも結果を返すことを望んでいません (要求パラメーターが指定されていないかのように)。
  • HTTP キャッシング: サービスの有効な HTTP ルートの数を制限して、HTTP キャッシング (つまり、ワニス) がより適切に機能するようにしたいと考えています。

たとえば、1 つを取るように構成された単純なコントローラーがあるとしますRequestParam

@RequestMapping(value = "/selective_route", method = RequestMethod.GET)
public String printTest(@RequestParam String test) {
    return test;
}

アプリがリクエストを受け入れ、OK レスポンスを返すようになりました:

/selective_route?test=foo

しかし、追加の不明なリクエスト パラメータがあることをアプリに認識させ、ERROR レスポンス コードを返すようにしたいと考えています。

/selective_route?test=foo&someotherparam=somethingelse
4

1 に答える 1

3

インターセプターはその仕事をすることができます。HandlerInterceptor を実装してフレームワークにアタッチする必要があります。受信リクエストごとに呼び出されます。

検証を実行する方法は、インターセプター自体の内部に有効なクエリ文字列のリストを保持し、たとえば正規表現を使用して、着信要求に対してそれらをチェックすることです。

より高速でクリーンなアプローチは、@RequestMapping と一緒にカスタム アノテーションを使用することです。このアノテーションは 1 つのパラメーターを取り、これも正規表現または許可されたフィールドの名前を含む配列です。

この種の注釈は、次のように宣言できます。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface YourAnnotationName {
    public String regularExpression() default "";
}

次のコードを使用して、インターセプター内からメソッドとその注釈を取得できます。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // Apply only to HandlerMethod
    if(!(handler instanceof HandlerMethod))
        return true;

    // Get method and annotation instance
    HandlerMethod method = (HandlerMethod) handler;
    YourAnnotationName annotation = method.getMethodAnnotation(YourAnnotationName.class);

    // Method not annotated no need to evalutate
    if(annotation == null)
        return true;

    // Validation
    String queryString = request.getQueryString();
    [...]
}
于 2015-07-12T06:02:03.383 に答える