【问题标题】:Errorhandling in Javascript/Java applicationJavascript/Java 应用程序中的错误处理
【发布时间】:2018-12-18 14:09:55
【问题描述】:

我正在开发我的第一个结合 Java 和 Javascript 的应用程序。由于它越来越多,是时候实施一些适当的错误处理了。但老实说,我的经验是零。

我的应用程序只允许用户填写存储在数据库中的不同公式。对于前端,我使用 Angular。数据库是 MySQL,使用 Hibernate 和 Spring。

前端已经进行了一些检查,例如验证用户输入的日期是否不超过 10 年。但我想到的是某种类型检查。例如,如果接收到的值确实是布尔值,如果不是,则抛出错误。

问题是:

这种类型检查应该在哪里执行?已经在使用 Javascript 的前端(考虑“typeof”)或在将接收到的值添加到数据库之前不久在后端?使用 Http 状态码还是将错误写入日志文件更好?

也许您可以推荐一些适合您的最佳做法或选项。

非常感谢!

【问题讨论】:

标签: javascript java error-handling


【解决方案1】:

这里有两件重要的事情需要考虑。

  1. 用户体验
  2. 系统安全

对于用户,您肯定希望尽早且经常地进行验证,最好以交互方式进行。例如,您的银行网站不允许您在信用卡号中输入字母;它肯定会在您键入后立即验证并使框变为红色。

后端必须单独保护,因为它可能被前端以外的其他来源使用。此外,您可能不想相信自己记得更新 UI 验证以处理每个潜在的后端错误。

在 NPM 和 Maven 中有很多不错的验证库,因此大多数验证的代码在两端都应该非常简单,并且将其保留在两者中可能是最安全的。

在担心整个系统作为一个整体之前,您应该始终单独对每个组件进行单元测试并确保其安全/功能正常。

您绝对应该使用 HTTP 状态码向任何 REST 应用程序中的前端报告后端错误,并尝试使用正确的状态码(例如,未找到、错误参数、未授权、内部错误)。无论你在前端做什么,你都会有后端错误需要处理(例如糟糕的 SQL 语法,数据库连接失败)。

【讨论】:

  • 感谢您的详细解释:)
  • 乐于助人:)。
【解决方案2】:

您应该在后端实现所有验证功能,基本上从不信任客户端数据。如果您的 API 在 Internet 上公开可用,人们会尝试使用、破坏或破解它。

此外,如果您决定编写另一个客户端(例如 Android 应用),则可以在客户端之间安全地重用 API。随意在前端实施额外的验证以提供更好的用户体验,但您不能跳过后端验证。

您可能希望实现现有标准之一,而不是开发自己的 API 标准,例如https://jsonapi.org/.

【讨论】:

    【解决方案3】:

    主要规则:

    • 在后端进行所有必要的检查:您永远不知道请求是否真的来自您的前端。所以让前端做一些检查很好,但后端负责不让废话传入您的数据库。
    • 每当出现问题时,请告诉您的调用者(您的技术支持的方式,例如 Java 中的异常、通过 HTTP/HTTPS 的响应代码)。
    • 确保每个问题都记录在一个且唯一的地方,其中包含以后分析所需的所有信息。这通常包括堆栈跟踪,因此应该在将错误结果代码传递给前端之前登录后端。在此处使用 ERROR 日志级别。
    • 在日志中添加额外的 WARN 和 INFO 条目,只要它们对运行应用程序站点的管理员有用。
    • 在搜索错误时,添加调试日志有助于您(开发人员)详细了解正在发生的事情。但是让日志框架通常禁止这些条目,否则管理员会非常不高兴不得不阅读大量(对他而言)不相关的日志。

    【讨论】:

    • 非常详细。谢谢 :)
    【解决方案4】:

    在后端验证

    在后端验证您的数据。所有数据流都会经过后端进入数据库。

    为什么在后端

    假设您提供后端的公共 api,而您只在前端进行一些验证。

    仍然可以将数据添加到您的数据库,因为您提供了一个公共 api。有人可以像 random-host:8080\delete\user\65434 这样调用你的 api。

    前端没有验证?

    当然!做一些验证——但这些是为了“普通”客户端的用户体验。通过这些验证,您的客户端无需等待服务器端验证,因为他可以直接从您的前端获得反馈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2016-08-18
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多