JavaScript中的业务逻辑。胖客户端与瘦客户端

时间:2010-11-10 15:25:10

标签: javascript client-side server-side

使用JavaScript在客户端实现业务逻辑是一个好主意吗?

应该有什么样的逻辑?验证逻辑?与GUI相关?

如果想要在另一个应用程序(公开)中使用相同的逻辑,在JavaScript中实现它,你会怎么做?这意味着你不能重用那个逻辑。

另一方面,在服务器端拥有所有逻辑将意味着对服务器的更多请求。

您怎么看?

8 个答案:

答案 0 :(得分:9)

永远不要相信客户。因此,您在客户端使用JavaScript进行的任何验证只能是为了提高用户的便利性和可用性。您必须稍后验证服务器上的传入数据,以确保没有人注入数据等。

答案 1 :(得分:7)

您可以创建可重复使用的Javascript模块,因此在几个不同的富有的uis中没有内在障碍来恢复逻辑。但是,正如已经指出的那样,您可能最终会在JavaScript和服务器上使用的任何内容之间重复(Java,PHP ...) - 在验证的情况下,在提供高性能之间进行权衡由于重复而导致的用户体验和复杂性。

我可以想象你会选择复制而不仅仅是验证的场景。考虑计算总订单价值:我们真的想要进行服务器端往返吗?对列表进行排序 - 我们倾向于在JavaScript中快乐地做到这一点,但是我们排序可以获得有趣的,专门的比较器功能吗?绘制边界可能非常棘手,计算折扣和销售税?

最后,这是一个判断电话,然后仔细了解后果。如果您复制逻辑,那么您可以设计一个确保一致性的测试策略吗?对于小批量系统,您可能倾向于支持更多的服务器交互和更少的重复,但您可能会针对更大或更苛刻的用户群做出不同的决策。

答案 2 :(得分:3)

从性能角度来看,在javascript中实现验证逻辑很方便,因为用户不必等待服务器调用,但仍需要验证发送到服务器的所有数据。

如果不这样做,最终会有恶意的人破坏你的背部系统。

答案 3 :(得分:2)

尝试做你正在寻找的东西的一种方法是使用某种类型的web服务/ web方法访问并让你的javascript对方法进行ajax调用,对业务逻辑进行验证然后发送一个返回回到前端。

现在前端对服务器很熟悉,但您可以轻松地与同一域内的其他应用程序共享该业务逻辑验证。这种方法的第二个好处是所有业务逻辑和验证都在服务器上,而不是以恶意的人可以轻松查看或操作代码的方式公开。

祝你好运,并希望这有助于一些人。

答案 4 :(得分:2)

'2013年的情侣(可能是意见):

Web应用程序的开发不应与任何其他应用程序不同。

采用任何2+层应用程序(任何普通的客户端 - 服务器模型都可以);在客户端或服务器上处理事情是否有意义?

效果考虑因素

您必须考虑处理能力,网络延迟,网络带宽,内存和存储限制。根据应用程序的不同,您可以选择不同的权衡方式。

胖客户端通常允许您在客户端上处理更多内容并卸载服务器,序列化更有效的消息有效负载,并最小化往返,所有这些都以处理能力,内存效率和可能的存储空间为代价。

安全注意事项

安全性是暂时性的,无论使用何种模型,每一方(不仅仅是服务器)总是必须在一定程度上验证并可能对从另一方接收的数据进行清理。对于许多Web应用程序,这意味着验证具有业务逻辑的实体,但并非总是如此。这取决于数据是什么,以及谁拥有数据(并且它并不总是服务器)。

由于Web浏览器已经验证了大量信息,因此客户端考虑因素较少,但不应该被遗忘(特别是在制作XHR或使用WebSockets的客户端中,手持量较少)。 / p>

有时,这意味着服务器和客户端确实会验证相同的数据。还行吧。如果您在双方开发软件,您可以将验证代码提取到客户端和服务器使用的模块(就像传统软件包中的所有这些“常见”模块一样)。由于您在Web环境中选择的语言在客户端受到限制,因此您可能必须妥协。话虽这么说,你可以在服务器上执行Javascript,或者使用像Emscripten(也见amd.js)之类的东西将许多语言编译成Javascript,或者甚至在不确定的未来使用像NaCl / PNaCl这样的东西运行本机代码。

<强>结论

我发现将Web应用程序客户端视为“立即安装”,“零配置”和“持续更新”客户端会有所帮助。我们不会将此术语用于Web,因为这些属性始终是传统的基于Web的软件所固有的,但它们不适用于传统的本机软件。同样,我们在开发本机软件时不使用“单页面应用程序”这样的术语,因为每当我们需要使用传统软件切换到新屏幕时,都不需要重新启动整个应用程序。

拥抱融合,保持开放的心态;来自不同社区的人们将在未来几年中相互学习。

答案 5 :(得分:1)

Javascript应该用于丰富用户在GUI中的体验,但是如果没有它,你的网站/ webapp仍然可以正常工作。

用户可以操纵发送到您的服务器的参数。如果您依赖Javascript来验证或创建这些值,那么您基本上会要求您的用户尝试做顽皮的事情。 (他们会)

用于验证的Javascript很好,它会减少对正常使用该应用程序的用户的服务器请求量。但这仍然在丰富他们的经验。您仍需要验证服务器端是否会尝试创建问题的l33t h @ x0rs的1%。

答案 6 :(得分:1)

我在过去几年里做了很多AJAX工作,我对它的看法是:

  • 将业务逻辑放在客户端中以扩充更重要的服务器端验证。我曾在一些金融机构工作过 他们总是有很好的安全性,因为它是深入的。客户端验证,服务器端验证,框架安全性等......但是它们总是在应用程序的每个部分都有它。他们从未假设任何东西是安全的,他们建立了他们的内部网应用程序,就像他们是互联网应
  • 其他业务逻辑也可以放入,但始终保持瘦客户端的想法。我将业务逻辑放在客户端的另一个主要原因是性能。

例如,一旦我有一个最顶层的下拉列表,它会在页面下方的五个其他控件下面。我没有为每个控件执行服务器端跳转,而是意识到最顶层的控件进行了一次调用并以级联方式控制所有后续控件上的数据显示。除非最顶层的下拉列表被更改,否则其他控件之间会使用相同的数据进行互操作。所以我创建了一个缓存/处理数据的管理器,性能非常好!大多数用户交互都基于初始下拉选择,类似于80-20的使用规则。大多数时候,他们只做了一个选择,得到了他们想要的东西。

  • 在客户端中使用Presentation Logic。我的意思是,如果您对可以通过属性在GUI Widget中执行的下拉列表进行排序,那么请务必执行此操作。当我在MVP(模型视图展示器)范例中使用GWT时,您从未在视图中放置任何业务逻辑,但您可以将表示逻辑放在那里。这不是商业逻辑的坚持,而是与另一方的良好关系。

答案 7 :(得分:0)

业务逻辑应尽可能与消费者无关。如果设计得当,您的客户端和服务器代码应该能够以可重用的方式使用您的业务逻辑(假设客户端和服务器都可以使用javascript)。

从客户端(浏览器等)消费您的业务逻辑可以防止对服务器的不必要的点击,假设恶意用户没有绕过您的UI来点击您的终端。然后,您的服务器可以使用相同的业务逻辑作为最后一道防线。

此外,如果设计得当,您可以扩展业务逻辑,以包含需要执行良好,在事务上下文中运行等的更复杂的工作流逻辑;通常是通过客户很难促成的事情。

您可以依赖许多design patterns来帮助您设计可重用的业务逻辑。

还有一些可用的微框架,例如peasy-js,它们可以帮助您快速创建易于重用,可扩展,可维护和可测试的业务逻辑。