2

Spring 3.2 アプリケーションがあり、トークン ベースのセキュリティを使用する REST API を作成しました。すべての REST JSON ペイロードには、セキュリティ検証を実行するために使用される「トークン」フィールドが含まれています。

コントローラーのメソッドは次のようになります。

@RequestMapping(value = "/something", method = RequestMethod.POST)
public
@ResponseBody
Map something(@RequestBody SomethingParams params) {
}

ここで、SomethingParams にはtokenフィールドがあり、リクエストの JSON 本文から Spring によって自動的に入力されます。

コントローラーのすべてのメソッドでバリデーターを自動的に呼び出して、SomethingParams などのパラメーターに有効なトークンがあることを確認する方法はありますか?

以前はインターセプターを使用しており、トークンはクエリ文字列に含まれていましたが、現在はリクエストの本文に含まれているため、チェックするにはインターセプターで JSON を解析する必要があります。Spring はすでに JSON を解析してパラメーターをバインドしているので、もっとスマートな方法があるかどうか知りたいです。理想的には、いくつかのグローバルまたはコントローラーレベルの設定を使用するだけです (メソッドごとではありません)。

4

3 に答える 3

3

そのような場合にはスプリングValidatorを使用できます。

@Component
public class SomethingParamsValidator implements Validator {
  @Override
  public boolean supports(Class<?> clazz) {
    return clazz.isAssignableFrom(SomethingParams.class);
  }

  @Override
  public void validate(Object o, Errors errors) {
    SomethingParams sp = (SomethingParams)o;
    validateToken(sp.getToken(), errors);
  }

  private void validateToken(String token, Errors errors) {
    if (!TokenUtils.isValid(token)) {
      errors.rejectValue("token", "foo", "Token is invalid");
    }
  }
}

次にController、次のメソッドを追加して登録します

@Autowired
SomethingParamsValidator somethingParamsValidator;

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(somethingParamsValidator);
}

@Valid最後に、オブジェクトに注釈を追加するだけで、SomethingParams検証されます。

@RequestMapping(value = "/something", method = RequestMethod.POST)
public @ResponseBody Map something(@Valid @RequestBody SomethingParams params) {
    // ...
}
于 2013-05-14T13:30:39.953 に答える
0

注釈が付けられたトークンフィールドを使用して基本クラスを作成しJSR-303 @NotNull、そこから拡張できます。

public class ParamsBase {
  @NotNull
  private String token;
  // getters, setters ...
}
public class SomethingParams extends ParamsBase {...}

そして、パラメータを次のようにマークします@Valid:

@RequestMapping(value = "/something", method = RequestMethod.POST)
public @ResponseBody Map something(@Valid @RequestBody SomethingParams params) {
    // ...
}

Spring は、実行時に利用可能な JSR-303 実装でパラメーターを自動的に検証します。

私は通常、実装プロバイダーとしてhibernate-validatorを使用します。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.1.Final</version>
</dependency>
于 2013-05-14T13:41:56.347 に答える
0

Aspectすべてのコントローラー メソッドをインターセプトし、パラメーターを検証する独自の を実装することもできます。@Validこれにより、注釈を取り除く機会が得られます。しかし、残念ながら、完全な例を説明する時間がありません。

于 2013-05-14T13:44:38.183 に答える