0

我正在使用 PlayFramework 构建一个通过 Ajax 工作的注册用户表单(它从不刷新页面),我显然需要对其进行验证。我正在考虑两种实现客户端和服务器端验证的方法。

  1. 通过 Ajax 将表单数据发送到服务器端验证,如果数据有效,则将用户保存在数据库中,或者在数据无效时向前端发送错误消息。所有这些都是通过 ajax 发生的,无需刷新页面。 Pro:这样我没有实现任何客户端验证,但我得到了相同的效果。 控制:我无法为每种类型的无效数据显示特定的错误消息(必需,最小长度,电子邮件格式,...)
  2. 使用客户端验证(jQuery 验证插件)验证表单,然后如果它有效,它将数据发送到服务器端验证。从服务器端,如果它是有效的,它会注册用户,否则什么都不会发生(?)。优点:显示特定错误消息的非常简单的方法控制:我需要实现 2 次相同的验证逻辑

这些是我的考虑,但我不知道它们是否正确,或者是否有其他更好的方法。您认为最好的方法是什么?

问题

第一种方法:是否可以从服务器验证发送特定的错误消息并使用 PlayFramework 在前端显示它们(无需从头开始编写所有验证规则)?

第二种方式:要实现服务器和端验证,我必须首先使用客户端验证来验证数据,然后传递给服务器?并且在浏览器上禁用了javascript:服务器端验证必须显示一些东西?(例如:值得注意的 Mediafire 没有这样做,我必须假设这是正确的)

编辑:这里是我用来通过 ajax 以 json 格式接收表单数据的代码:

控制器:

    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 对象,这样你就可以在你想要的地方显示它们。

对于其他形式(如一些注册、消息传递等),使用现成的前端验证器是一个不错的方法,因为您可以避免一些冗余请求并且它工作得更顺畅,无论如何主要验证应该始终在后端完成 - 只需使用前端一个作为“您网站的有趣补充”。

并且不要担心禁用的 JS - 在这种情况下,您将无法执行甚至简单的 AJAX 请求;)

编辑

如上所述,您可以只返回一个 JSON 对象(也带有错误列表)并使用 JavaScript 处理它,尽管可能有许多不同的方法,但有一种可能性:

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 回答