【问题标题】:Questions about implement server side and client side validation关于实现服务器端和客户端验证的问题
【发布时间】:2013-10-28 09:00:30
【问题描述】:

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

  1. 通过 Ajax 将表单数据发送到服务器端验证,以保存 如果数据有效,则数据库中的用户,或向数据库发送错误消息 前端以防数据无效。所有这些都是通过 ajax 发生的 无需刷新页面。 Pro:这种方式我没有实现任何 客户端验证,但我得到相同的效果。 控制:我无法显示具体 每种类型的无效数据的错误消息(必需,最小长度, 电子邮件格式,...)
  2. 使用客户端验证(jQuery Validation 插件),然后如果它是有效的,它会将数据发送到服务器端 验证。从服务器端,如果它是有效的,它会注册 用户,否则什么也不会发生(?)。 专业版:非常简单的展示方式 具体错误信息Contro:我需要执行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)特定的错误消息并在表单的每个输入下显示它们

【问题讨论】:

  • 问什么是实现目标的“最佳”方式的问题往往会导致辩论和争论,而不是简洁的正确答案。我已投票以“基于意见”的方式结束。
  • @DuncanJones:看看编辑,我已经更好地解释了这个问题

标签: java ajax validation playframework playframework-2.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);

}

【讨论】:

  • 您好,谢谢您的回答。请注意,我的问题是关于注册表单(不是登录)。你能看一下编辑后的第一篇文章吗?我已经添加了我正在使用的代码,并更好地解释了我不能做什么。谢谢
  • 好,我不知道 errorsAsJson() 函数。之后在 JS 中我将有一个 json 对象来处理,但我需要在输入下显示每条消息(不像错误墙),这似乎不是那么简单!有什么建议吗?
  • 使用 jQuery 你可以做任何你需要的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2023-04-08
相关资源
最近更新 更多