1

Spring MVC(Spring 3.1.0)を使用しています。
XSSが原因で、システムから出力されるすべての文字列をHTMLエンコードしたいと思います。
しかし、そのようにエンコードしたくない出力(リンクなど)がありますContextualSerializer。そのために、それを実装するクラスを使用して作成することにしました。
このメソッドcreateContextualは、カスタムアノテーション(@NoHTMLEscap)の存在を確認し、返すを決定しJsonSerializerます。

これが私の注釈です:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface NoHTMLEscap {
}

私はそれを試しましたが、POJOでうまく機能しますが、失敗するケースは次のとおりです。

@Controller
@RequestMapping(value = "/something")
public class MyController {

    ...

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    @ResponseStatus(value = HttpStatus.OK)
    public String getName(@PathVariable String id) {
         return "Here is your answer";
    }
}

Springは戻り値をjacksonに送信しますが、このメソッドはStringPOJOではなく戻り値を返すため、アノテーションの存在を確認する方法がないため、実際にアノテーションを使用することはできません...

この情報をジャクソンのシリアライザーに取得する方法はありますか?
よくわかりませんが、文字列をエスケープしないスプリング固有のコンバーターを使用する必要があると思いました(これで問題が正しく解決されるかどうか、およびこれをどのように実装できるかはわかりません)。

4

1 に答える 1

2

ジャクソンがユースケースに直接的な実際のソリューションを提供できるとは思いませんが、別のソリューションを提案できます。
これらの Strings の周りにラッパー オブジェクト (LinkWrapper など) を配置する余裕がある場合は、現在のシリアライザーに委譲する LinkWrapper の別のシリアライザーを追加できます。LinkWrapper オブジェクトでは、文字列に注釈を付けて、デリゲート シリアライザーがエンコードれていない状態でシリアル化します。
また、カスタム シリアライザーは文字列シリアライザーのデリゲートのみであるため、出力はオブジェクトの出力にはなりません。
コードサンプルが必要な場合は、ただ言うだけですが、それは構成の非常に単純なケースだと思います.

于 2012-08-16T05:55:17.790 に答える