java - 关于实现服务器端和客户端验证的问题

标签 java ajax validation playframework playframework-2.1

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

  1. 通过 Ajax 将表单数据发送到服务器端验证,从而保存 如果数据有效,则向数据库中的用户发送一条错误消息 前端以防数据无效。所有这一切都是通过 ajax 发生的 无需刷新页面。 Pro:这样我就不会实现任何 客户端验证,但我得到了相同的效果。 Contro:我无法显示具体内容 每种类型的无效数据的错误消息(必需、最小长度、 电子邮件格式,...)
  2. 使用客户端验证来验证表单(jQuery Validation 插件),如果有效,则将数据发送到服务器端 验证。从服务器端,如果它有效,它会注册 用户,否则什么也不会发生(?)。 专业版:非常简单的展示方式 具体错误消息Contro:我需要实现2次相同的 验证逻辑

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

问题:

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

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

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

Controller :

    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)特定错误消息并在表单的每个输入下显示它们

最佳答案

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

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

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

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

}

关于java - 关于实现服务器端和客户端验证的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19630595/

相关文章:

java - 如何创建 LinkedHashMultiset<String>?

java - Scala 2.9.2 无法处理 String 类的重载格式方法 - 为什么?

javascript - 有没有办法确定 blob URL 是否指向某些内容?

java - 联合测试: testing all possible boundaries?

php - 插入前检查日期时间字段

java - 如何从 JavaFX 中的 AnchorPane 获取组件

java - 调试二次方程绘图器 (Java)

javascript - 仍然无法弄清楚我在让 PHP 函数处理 WordPress 中的 AJAX 请求方面做错了什么

javascript - 对子域的 AJAX 调用是否被视为跨站点脚本?

javascript - CakePHP 和 AngularJS - {{$index}} 的评估