Web 应用程序:客户端域逻辑

Posted

技术标签:

【中文标题】Web 应用程序:客户端域逻辑【英文标题】:Web Applications: Client-side domain logic 【发布时间】:2010-10-23 04:43:30 【问题描述】:

我们看到越来越多的网络应用程序在客户端完成。 UI 操作、输入预验证(当然不是作为验证的最后手段)、小部件、效果等。

如果决定将域逻辑放在用 javascript/GWT/其他任何东西编写的客户端上怎么办?服务器只是提供数据库基础设施。

这听起来对您可行吗?对这个想法有什么经验、建议或意见吗?

编辑: 如果您四处寻找,您会发现可以编写整个 applications 而不需要一行 php/python/java/whatever。

【问题讨论】:

【参考方案1】:

我恭敬地不同意这里的其他海报。事实上,我已经实现了这样一个scrabble board game,几乎完全使用客户端逻辑。事实上,我想做很多事情来使它更加客户端密集。 GMail 在客户端做了大量的工作。

但是,出于实际原因,有些事情需要在发球端进行管理。例如,服务器需要给用户一些瓦片,然后用户可以告诉服务器他把这些瓦片放在哪里,服务器需要验证这些槽是空的,因为服务器永远不能完全信任客户端(客户端总是可以被劫持,如果不是通过脚本,则通过嗅探 HTTP 流量并对其进行修改)。

有很多技术,比如 ADO.NET 数据服务通过 RESTful 接口公开数据库中的 CRUD 操作,以及 CouchDB 直接通过 JavaScript 存储/管理数据对象。此外,像 jQuery 或 Moo Tools 这样的富客户端库确实在推动客户端做更多的事情。

如果您仔细想想,flash 主要是在客户端完成所有 UI 和交互工作。一些 Adob​​e Flex 应用程序非常棒。我最近将一个用于谷歌分析,它在客户端呈现图形、旋转和所有这些。服务器只提供数据。即便如此,Google Gears 和 Firefox(我相信是 3.2?)现在也提供客户端存储,这使得断开连接的应用场景变得更加有趣。

【讨论】:

【参考方案2】:

这些东西都很好,但请记住,如果有人禁用了 javascript,您需要能够处理该问题并在用户弄乱您的数据库之前验证服务器上的输入。因此,您可以在客户端放置您想要的任何内容,但您还需要在服务器端进行验证。

【讨论】:

【参考方案3】:

在我看来,这不是一个可行的想法。造成这种情况的原因有很多。

    如果用户因为浏览器较旧而没有这些客户端功能会怎样?该网站很可能无法运行。 始终,始终在服务器上执行所有相同的检查,以验证输入和规则检查,就像在客户端上一样。否则,它会导致您的网站出现重大安全问题。用户可以绕过所有 javascript 检查并对您的数据库执行任何他们想做的事情。

总而言之,虽然客户端代码非常适合为用户提供比网页感觉更像应用程序的感觉,但为了网站的安全性和可访问性,需要同时实现这两种技术。

【讨论】:

【参考方案4】:

我认为这是不可行的,至少如果您的目标是一致性和速度。将大量逻辑放入说 Javascript 会导致浏览器的大量工作,这意味着一个缓慢的客户端。另外,不要忘记所有浏览器都有它们的小怪癖。

【讨论】:

【参考方案5】:

取决于应用程序以及您希望如何使用它并重用代码。

客户端 JavaScript 确实特定于网络浏览器。

域对象和实体可以在其他应用程序(桌面、Web 服务等)中重复使用

更不用说当你的应用变得越来越大时,下载时间也会越来越长。

当然,任何人都可以立即复制粘贴您的代码并克隆您的应用。

【讨论】:

【参考方案6】:

对于任何公共(和非公共)Web 应用程序,有人尝试检查您的防御措施只是时间问题。 JavaScript 验证将是第一个去的。因为您可以在浏览器中禁用它,甚至在使用您的应用程序时禁用/启用它以达到理想的效果。

实际上你应该有三个级别的验证。

    UI 验证(可选):首次检查用户输入。无需服务器往返即可快速响应 -> 用户很高兴 + 您的服务器很高兴您已经可以将他们从一些无效请求中解放出来。

    服务器端验证(必需)。再次进行所有验证+业务逻辑规则。您可能必须访问一些标准或第三方库来检查/验证/做任何您必须做的事情。在这里,您可以实现 BL 级别的数据完整性。

    数据库级验证(非常理想)。最后一道防线。通过使用外键/唯一键/等来保证数据完整性。多个并行请求的约束 + 事务级保护会突然破坏您的 BL 级完整性。

如果你想做对,那就应该是这样。

【讨论】:

【参考方案7】:

您可以在此处找到有关 Web 应用性能分析的精彩摘要:http://www.websiteoptimization.com/speed/tweak/psychology-web-performance/

简而言之,现代 Web 应用程序在性能提升方面挣扎了 100 毫秒。在如此短的时间跨度下,依赖 http 延迟已经是一个问题。所以很多逻辑都转移到客户端,只是为了减少与用户交互时的 http 调用次数。

有许多可用和正在开发的框架有助于构建复杂的客户端代码。一开始:jQuery (UI)、Dojo、MooTools、Prototype 等 - 这些更多是通用框架,适用于任何类型的客户端逻辑。

更准确地说:

Backbone.js - 纯 JavaScript 中的 MVC 核心实现。 jQuery.templates, jsViews, jsRender - 客户端渲染和数据绑定 其他

这里有不同框架的全面概述http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/

【讨论】:

以上是关于Web 应用程序:客户端域逻辑的主要内容,如果未能解决你的问题,请参考以下文章

ASP MVC 5 在不同域上运行 HTML5 客户端和 Web API 服务器

域、DAO 和服务层

C/C++ 用于 Web 应用程序的核心逻辑开发?

vue-resource 怎么解决跨域问题

java web 九大内置对象和四个作用域之间的关系是啥?

jsonp跨域请求