4

Oval 検証フレームワークを使用して、HTML フィールドが悪意のある JavaScript コードを保持できないフィールドを検証しています。悪意のあるコードを検出するために、フィールドでエラー メッセージとして使用したいエラーのリストを返す外部フレームワークを使用しています。私が直面している問題は、setMessages(List) のようなことをしたいのに、チェックの実装では setMessage しかできないことです。そのため、現在はエラーをコンマで結合しているだけですが、リストとして戻すことをお勧めします。

注釈

@Target({ ElementType.METHOD, ElementType.FIELD})
@Retention( RetentionPolicy.RUNTIME)
@Constraint(checkWith = HtmlFieldValidator.class)
public @interface HtmlField {
   String message() default "HTML could not be validated";
}

小切手

public class HtmlFieldValidator  extends AbstractAnnotationCheck<HtmlDefaultValue> {
    public boolean isSatisfied( Object o, Object o1, OValContext oValContext, Validator validator ) throws OValException {
        if (o1 == null) {
            return true;
        } else {
            CleanResults cleanResults = UIowaAntiSamy.cleanHtml((String) o1);
            if (cleanResults.getErrorMessages().size() > 0) {
                String errors = StringUtils.join(cleanResults.getErrorMessages(), ", ");
                this.setMessage(errors);
                return false;
            } else {
                return true;
            }
        }
    }
}

モデルクラス

class Foo {

    @HtmlField
    public String bar;

}

コントローラーコード

Validator validator = new Validator(); // use the OVal validator
Foo foo = new Foo();
foo.bar = "<script>hack()</script>";

List<ConstraintViolation> violations = validator.validate(bo);

if (violations.size() > 0) {
    // inform the user that I cannot accept the string because 
    // it contains invalid html, using error messages from OVal
}
4

2 に答える 2

4

setMessage(String message)がスーパークラスによって作成されたメソッドである場合は、それをオーバーライドして、データを受け取ったら、文字列をリストに分割し、実際にコードを配置する 2 番目の関数を呼び出すことができます。ちなみに、エラー メッセージ自体にコンマが含まれている可能性があるため、区切り文字列をより一意のものに変更することもお勧めします。

あなたの質問はあまり意味がありません。スーパークラスに実装されたメソッドに「それらを戻す」場合、スーパークラスがデータを処理するため、質問の要点全体が無効になります。

メソッドは、データのチェック後にアクセスする予定のエラー メッセージを格納する変数をsetError設定する単純なセッターであると仮定します。Stringデータを好みの型にしたいので、クラスに文字列の新しい配列を作成し、スーパークラスを無視します。必要に応じて、両方を使用することもできます。

public class HtmlFieldValidator  extends AbstractAnnotationCheck<HtmlDefaultValue> {
    public String[] errorMessages = null;

    public void setErrorMessages(String[] s) {
        this.errorMessages = s;
    }

    public boolean isSatisfied( Object o, Object o1, OValContext oValContext, Validator validator ) throws OValException {
        if (o1 == null) {
            return true;
        } else {
            CleanResults cleanResults = UIowaAntiSamy.cleanHtml((String) o1);
            if (cleanResults.getErrorMessages().size() > 0) {
                //String errors = StringUtils.join(cleanResults.getErrorMessages(), ", ");
                //this.setMessage(errors);
                this.setErrorMessages(cleanResults.getErrorMessages());
                return false;
            } else {
                return true;
            }
        }
    }
}

他の場所:

HtmlFieldValidator<DefaultValue> hfv = new HtmlFieldValidator<DefaultValue>();
boolean satisfied = hfv.isSatisfied(params);
if (!satisfied) {
    String[] errorMessages = hfv.errorMessages;
    //instead of using their error message

    satisfy(errorMessages);//or whatever you want to do
}

編集:

コードを更新した後、あなたの意味がわかります。これはやり過ぎだと思いますが、後で文字列を配列に変換する方がはるかに簡単ですが、ValidatorそのsetMessageメソッドを拡張する新しいクラスを作成することで実行できる場合があります。このメソッドではsuper.setMethod、文字列を分割してそのクラスの配列として格納するだけでなく、呼び出します。

class ValidatorWithArray extends Validator {
    public String[] errors;
    public final static String SPLIT_REGEX = ";&spLit;";// Something unique so you wont accidentally have it in the error

    public void setMessage(String error) {
        super.setMessage(error);
        this.errors = String.split(error, SPLIT_REGEX);
    }
}

HtmlFieldValidator

public boolean isSatisfied( Object o, Object o1, OValContext oValContext, Validator validator ) throws OValException {
            if (o1 == null) {
                return true;
            } else {
                CleanResults cleanResults = UIowaAntiSamy.cleanHtml((String) o1);
                if (cleanResults.getErrorMessages().size() > 0) {
                    String errors = StringUtils.join(cleanResults.getErrorMessages(), ValidatorWithArray.SPLIT_REGEX);
                    this.setMessage(errors);
                    return false;
                } else {
                    return true;
                }
            }
        }

そして今、ValidatorWithArray代わりに使用するだけですValidator

于 2012-10-20T01:54:52.570 に答える
0

これを達成したい状況はあなたの状況とは異なりましたが、私の場合は、エラーごとに注釈を作成するのが最善でした(複数のエラーを返す注釈を作成するのではなく)。私の場合、発生する可能性のあるエラーの数に依存すると思いますが、それはわずか2つか3つでした。

この方法により、必要な場所に注釈を追加して自由に組み合わせることができるため、コードを非常に簡単に再利用できます。

于 2016-04-08T17:18:28.287 に答える