2

私は最初の Spring 3 webapp を開発しています。Spring 2 では、formBackingObject でデータベースからデータをロードし、Spring バインディングでフィールドの一部を更新し、onSubmit でそれらの変更を保持していました。

Spring 3 では、次の 2 つのオプションがあるようです。

  1. ユーザーが永続オブジェクトを 100% 編集できるようにします。これは、オブジェクトの ID が隠しフィールドである必要があることを意味します。
  2. 編集可能なデータを保持するフォーム オブジェクトを作成し、送信時にそれを永続オブジェクトにマップします。

最初のオプションは実際にはオプションではありません。ユーザーにすべてのフィールドを編集させることはできません。また、F12 キーを押すことができる人なら誰でも値を変更できる隠しフィールドにデータを表示したくありません。

2 番目のオプションは、まともな設計アプローチのようです。ただし、基本的にすべての編集可能な永続クラスを複製する必要があるようです。

@Entity
public class Company {
    private String uuid; // not editable!
    .. 30 other properties, 2 are not editable
}

public class CompanyForm {
    .. 28 of above properties
}

そして、多くのマッピングメカニズム

public void map(CompanyForm cf, Company c) {
    cf.setName(c.getName());
    .. 27 other set(get())
}

これが Spring の MVC バインディングの「設計どおり」のアプローチではないことを祈っています。ただし、これまでに見つけたすべてのチュートリアルは非常に簡単で、上記のオプション 1 を実装しています。オプション2を実装するための提案はありますか?

ありがとう、サイモン

4

3 に答える 3

2

データバインダー API

許可されたフィールドの配列を設定しないと、セキュリティに影響する可能性があることに注意してください。たとえば、HTTP フォーム POST データの場合、悪意のあるクライアントは、フォームに存在しないフィールドまたはプロパティの値を提供することで、アプリケーションを破壊しようとする可能性があります。場合によっては、コマンド オブジェクトまたはそのネストされたオブジェクトに不正なデータが設定される可能性があります。このため、 DataBinder でallowedFieldsプロパティを指定することを強くお勧めします。

オプション1と合わせてご利用いただけます

于 2013-10-21T17:14:27.157 に答える
0

実用的な方法は、更新ステートメントの編集不可能なフィールドを無視することです。

于 2014-05-12T10:54:56.023 に答える
0

過去に @ModelAttribute アノテーションを使用してリクエストの PK を検出することで、実際にこれを回避しました。このようにすると、Spring は @ModelAttribute から返されたオブジェクトを使用し、送信されたオブジェクトをそれに自動的にコピーします。

これは一種のハックであり、コードを維持するためにやってくる人には明らかではありません。

于 2014-05-16T17:16:58.147 に答える