0

私は PlayFramework を使用して、Ajax 経由で機能する登録ユーザー フォームを作成しています (ページが更新されることはありません)。明らかにそれを検証する必要があります。クライアント側とサーバー側の検証を実装する 2 つの方法を検討しています。

  1. Ajax経由でフォームデータをサーバー側の検証に送信し、データが有効な場合はデータベースにユーザーを保存し、無効なデータの場合はフロントエンドにエラーメッセージを送信します。これはすべて、ページを更新せずに ajax を介して行われます。 Pro : このようにして、クライアント側の検証を実装しませんが、同じ効果が得られます。 コントロール: 無効なデータの種類ごとに特定のエラー メッセージを表示できません (必須、最小の長さ、メール形式など)。
  2. クライアント側の検証 (jQuery Validation プラグイン) でフォームを検証し、有効な場合はデータをサーバー側の検証に送信します。サーバー側からは、有効な場合はユーザーを登録し、そうでない場合は何も起こりません (?)。長所:特定のエラー メッセージを表示する非常に簡単な方法短所: 同じ検証ロジックを 2 回実装する必要がある

これらは私の考慮事項ですが、それらが正しいかどうか、または他のより良い方法があるかどうかはわかりません。これを行うための最良の方法は何だと思いますか?

質問:

最初の方法: サーバー検証から特定のエラー メッセージを送信し、PlayFramework を使用してフロントエンドに表示することは可能ですか (すべての検証ルールをゼロから作成する必要はありません)。

2 番目の方法: サーバーとサイドの両方の検証を実装するには、最初にクライアント検証でデータを検証してからサーバーに渡す必要がありますか? ブラウザでJavaScriptを無効にすると、サーバー側の検証で何かが表示される必要がありますか? (例: 注目に値する Mediafire はそれを行いません。正しいと仮定する必要があります)

編集:ここでは、JSON形式でajaxを介してフォームデータを受信するために使用しているコード:

コントローラ:

    JsonNode json = request().body().asJson();      
    Form<User> userForm = User.form.bind(json);

    if(userForm.hasErrors()) {
        return badRequest("One or more inputs are invalid");
    } else { 
       // register the user in the db
    }

モデル (ユーザー):

    @Required
    public String email;

    @Required @MinLength(8) @MaxLength(16)
    public String password;

    public static Form<User> form = Form.form(User.class);

そのままでは、無効な入力に対して一般的なメッセージが返されます。私ができないことは、(badRequest を使用して) 特定のエラー メッセージを返し、フォームの各入力の下に表示することです。

4

1 に答える 1

1

あまりにも短いユーザー名でログインしようとしたことを誰かに伝える必要はありません。この特定のケースでは、次のようなエラーを表示するだけで十分です。一般に、ログイン失敗の正確な理由をユーザーに伝えないことをお勧めします。これにより、総当たりのログイン試行が (少し) 防止されます。

エラーをどのように処理するかはあなた次第です。すべてのエラーのリストを含む JSON オブジェクトを簡単に返すことができるので、必要な場所に表示できます。

他のフォーム (一部の登録、メッセージングなど) では、すぐに使用できるフロントエンド バリデーターを使用するのが良い方法です。いくつかの冗長リクエストを回避でき、よりスムーズに動作するためです。とにかく、メインの検証は常にバックエンドで行う必要があります。フロントエンドを使用するだけです。 1つは「あなたのサイトへの興味深い追加」として。

無効化された JS について心配する必要はありません。この場合、単純な AJAX リクエストでさえ実行できなくなります ;)

編集

上記のように、JSON オブジェクト (エラーのリストも含む) を返すだけで、JavaScript で処理できます。多くの異なるアプローチがある可能性がありますが、可能性の 1 つがあります。

public static Result submit() {
    Form<User> userForm = Form.form(User.class).bindFromRequest();
    ObjectNode output = Json.newObject();

    if (userForm.hasErrors()) {
        output.put("status", 400);
        output.put("errors", userForm.errorsAsJson());
        return badRequest(output);
    }

    output.put("status", 200);
    output.put("msg", "Your account was registered correctly!");
    return ok(output);

}
于 2013-10-28T13:57:04.000 に答える