有关实现服务器端和客户端验证的问题

时间:2013-10-28 09:00:30

标签: java ajax validation playframework playframework-2.1

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

  1. 通过Ajax将表单数据发送到服务器端验证,保存 数据库中的用户,如果数据有效,或者向其发送错误消息 无效数据时的前端。所有这些都是通过ajax发生的 没有刷新页面。 Pro :通过这种方式,我没有实现任何 客户端验证,但我得到相同的效果。 Contro :我无法展示具体内容 每种类型的无效数据的错误消息(必需,最小长度, 电子邮件格式,...)
  2. 使用客户端验证(jQuery验证)验证表单 插件),如果它有效,它会将数据发送到服务器端 验证。从服务器端,如果它有效,它会注册 用户,否则没有任何反应(?)。 专业:非常简单的展示方式 特定错误消息 Contro :我需要实现2次相同的错误消息 验证逻辑
  3. 这些是我的考虑因素,但我不知道它们是否正确或是否还有其他更好的方法。你认为这样做的最佳方式是什么?

    问题

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

    使用第二种方法:要实现服务器和侧面验证,我必须首先使用客户端验证验证数据然后传递给服务器?并且在浏览器上禁用了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)特定的错误消息,并在表单的每个输入下显示它们

1 个答案:

答案 0 :(得分:1)

您不需要告诉某人他尝试使用太短的用户名登录,在这种特殊情况下,如果您只是显示如下错误就足够了:登录不正确。一般建议不要告诉用户登录失败的确切原因是什么 - 它可以防止(一点点)对抗暴力登录尝试的尝试。

如何处理错误取决于您,您可以轻松返回包含所有错误列表的JSON对象,以便您可以将它们显示在所需的位置。

对于使用即用型前端验证器的其他形式(如某些注册,消息等)是一种很好的方法,因为您可以避免一些reduntand请求,它只是工作更顺畅,无论如何主要验证应始终在后端完成 - 只需使用前端一个作为“对您网站有趣的补充”。

并且不要担心禁用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);

}