• 请不要在回答技术问题时复制粘贴 AI 生成的内容
alexapollo
V2EX  ›  程序员

前端/终端和后端都要检验输入的合法性,开发工作量*2,是否有更简单的处理方法?

  •  
  •   alexapollo ·
    geekan · Sep 20, 2016 · 10785 views
    This topic created in 3706 days ago, the information mentioned may be changed or developed.

    前端要在输入错误时做实时提示(可能得有本地逻辑),后端要保证数据合法
    需求可能不同,但活确实是差不多的
    有没有比较好的方法来做这个事?

    50 replies  •  2016-10-07 17:22:51 +08:00
    seki
    seki
    Sep 20, 2016
    1
    用框架和模板
    linuxchild
    linuxchild
    Sep 20, 2016 via iPhone
    2
    没有吧 后端不能相信前端传来的数据…
    sylecn
    sylecn
    Sep 20, 2016 via Android
    3
    如果是浏览器客户端,前端必须支持编译到 JavaScript 才能在浏览器执行, 所以能够做到的语言不多。我知道的能在生产环境用的只有 JavaScript 和非常相关的替代比如 coffee script 和 typescript ,以及 clojurescript.

    如果前端是 app 或者桌面应用,可以前后端用同一种语言开发。这样就可以用共享库 /模块的方式 share 代码。只要把校验这部分代码分割出来成为独立模块就好。

    问问题的时候还是多给些上下文比较好。核心思路都是在前端和后端用同一种语言。当初 node.js 兴起的时候,这个是一大卖点。
    think2011
    think2011
    Sep 20, 2016
    4
    后端传验证规则给前端。

    这是本来打算做的做法,后来因为某些原因搁浅了。
    EthanZ
    EthanZ
    Sep 20, 2016❤️12
    5
    validations on FE are for stupid users,
    validations on BE are for malicious users.
    ChiangDi
    ChiangDi
    Sep 20, 2016 via Android
    6
    都用 JavaScript
    hjc4869
    hjc4869
    Sep 20, 2016 via iPhone
    7
    后端传一个正则和一个提示文本给前端。
    maxlvlvlv
    maxlvlvlv
    Sep 20, 2016 via iPad
    8
    Middleware
    ersic
    ersic
    Sep 20, 2016❤️19
    9
    我觉得前端验证是为了提高用户体验,后端验证是为了系统的安全性,功能性是不同的。
    huntererer
    huntererer
    Sep 20, 2016
    10
    字数什么的验证可以放前端,用户体验好,但是"真正"的验证一定要放后端校验。
    ChefIsAwesome
    ChefIsAwesome
    Sep 20, 2016
    11
    活差多了好吧。除了个正则一样,其他都不一样。
    int64ago
    int64ago
    Sep 20, 2016
    12
    前后端都是 JS 的话,就共用一套实现就好了
    myweishanli
    myweishanli
    Sep 20, 2016
    13
    可以参考 yii2 后端配置好规则,前端自动生成对应的验证代码,后端也是根据规则验证。
    sundev
    sundev
    Sep 20, 2016
    14
    这的确是个问题,因为随着前端规模的增大,验证已经不局限于一个正则了,而是复杂的逻辑,那么必然导致前端后端出现重复的逻辑。我做的一个项目也出现这个问题,正在寻找方法。
    我们目前的做法是简单验证由自定义好的规则,后端前端自动生成部分验证逻辑,但是碰到复杂逻辑是后端前端各写一份代码。
    sunjourney
    sunjourney
    Sep 20, 2016❤️1
    15
    前端验证只是保证用户体验的,想省功夫就用 ajax 后端实时验证咯
    lwbjing
    lwbjing
    Sep 20, 2016
    16
    那就,,前端就不要做了,后端去提示,,哈哈。。
    4641585
    4641585
    Sep 20, 2016
    17
    这是谈到 Node.js 有什么优势时的一个典型场景。
    cosgbgas
    cosgbgas
    Sep 20, 2016
    18
    这的确是个问题。
    7sDream
    7sDream
    Sep 20, 2016❤️1
    19
    貌似用 Django + django-angular 可以做到写一遍验证,前后端通用。

    还有我之前准备报名 GSoC 的时候写的一个 proposal ,是准备给 Django 增加通用的客户端验证组件:

    https://gist.github.com/7sDream/46de98da073b9021c5d0

    发到 Google Group 之后貌似大家也挺支持的。

    但是准备报名的时候我家出了点事,然后 proposal 就没写完……

    后来我补完了,但是也没机会参加了 =,=

    不过思路应该还可以?
    qhxin
    qhxin
    Sep 20, 2016
    20
    除非打造可信前端、终端、信道。然而这样成本比做两次验证还大。而且现有环境下前端验证和后端验证的性质是不一样的,不能混为一谈。
    Karblue
    Karblue
    Sep 20, 2016
    21
    又想用户体验好。又想省事。让我和为难啊(:doge
    zikkeung
    zikkeung
    Sep 20, 2016
    22
    typescript 可破
    guyskk
    guyskk
    Sep 20, 2016 via Android
    23
    校验规则理论上是可以前后端通用的,但 JS 版还没实现。根据后端 API 自动生成 JS 代码,发出请求之前自动校验数据,不通过就直接生成一个 400 响应。
    https://github.com/guyskk/validater
    有打算实现 JS 版的联系我吧,有问题也可以提 issue 。
    baby4free
    baby4free
    Sep 20, 2016
    24
    理论上是可以后端校验就行了 跟前端约定好错误码及错误消息体 前端可以根据返回的错误做对应的展示
    不过为了用户体验 前端还是做一下比较好
    BruceLi
    BruceLi
    Sep 20, 2016
    25
    都要验证,不过前端是为了提升用户体验,后端是为了业务逻辑的完整和数据安全,侧重点不同,验证的方法也不完全一样,如果前后端可以分享代码,把验证的逻辑单独变成一个库应该能节省一些人力和时间。
    tobeyouth
    tobeyouth
    Sep 20, 2016
    26
    可以把校验写成 schema,前后端引用同一份 schema 文件,然后各自进行校验

    http://json-schema.org/
    wizardforcel
    wizardforcel
    Sep 20, 2016
    27
    找不同的人做,让人手 *2 。
    sampeng
    sampeng
    Sep 20, 2016
    28
    这本来就是一个体力活。。。
    tanszhe
    tanszhe
    Sep 20, 2016
    29
    一个小插件 http://www.yxsss.com/g/ 在表单原生加入 req exp ts 这 3 个属性就好了
    req="true"
    exp ="正则表达式"
    ts ="文案"
    vghdjgh
    vghdjgh
    Sep 20, 2016
    30
    楼上说的 json schema 是一个方式
    不过只能验证是不是合法,前端体验不一定满足需求,所以常用于后台系统。
    wxhm1120
    wxhm1120
    Sep 20, 2016
    31
    再招个人-。-
    Nitroethane
    Nitroethane
    Sep 20, 2016
    32
    话说这种事不是应该安全部门的人负责么 0.0
    ibufu
    ibufu
    Sep 20, 2016
    33
    前端别做了吧,反正后端会抛个错误过来
    oyjc
    oyjc
    Sep 20, 2016
    34
    服务端: C# (.net
    浏览器: C# 使用 Bridge.net 编译到 Javascript

    ** 在不久的未来:
    服务端: C#
    浏览器: C# 编译到 Webassembly ,直接操作浏览器 DOM 等 Javascript 能访问到的 API.
    chemzqm
    chemzqm
    Sep 20, 2016
    35
    godmin railsadmin 只要在 model 层加上验证就可以了,谁用谁知道😀
    alexapollo
    alexapollo
    OP
    Sep 20, 2016
    36
    @seki 什么框架和模板能比较好解决这个问题呢
    @sylecn 可行,但 JS 感觉还是略 evil ,我倒是愿意用 scala 做前后端统一的语言 LOL
    @think2011 有理,但感觉写起来会不会比纯前端逻辑复杂得多?毕竟约束规则没法很简单的描述,除非校验的地方很通用,一开始都想得清楚才行
    @ersic 但始终都增加了 100%工作量
    @7sDream 写的真多啊,不错的活,不过 django-angular 好使吗。。绑定到某个前端框架特别费劲。。
    7sDream
    7sDream
    Sep 20, 2016
    37
    @alexapollo 我自己并没有用过 不过 Google Group 上的人回复我说这个写的不错。有个 form validation 的 Demo : http://django-angular.awesto.com/form_validation/
    WalkingEraser
    WalkingEraser
    Sep 20, 2016 via Android
    38
    自己写个 parser 处理,/滑稽
    FrankFang128
    FrankFang128
    Sep 20, 2016
    39
    你们搞前后分离的,终于发现这个问题了?
    guyskk
    guyskk
    Sep 21, 2016 via Android
    40
    @FrankFang128
    没分离就不用校验吗,校验都放在服务端了而已,
    分离后也可以只服务端校验。
    Felldeadbird
    Felldeadbird
    Sep 21, 2016
    41
    我的做法是,后端返回 JSON ,包含必要的信息。然后前端做提示就行了 :) 。绝对够懒。
    qiyuey
    qiyuey
    Sep 21, 2016 via Android
    42
    controller 层需要验证一遍, service 层需要验证一遍,怎么破?
    bdbai
    bdbai
    Sep 21, 2016 via Android
    43
    @FrankFang128 后端怎么实时校验?
    zongren
    zongren
    Sep 21, 2016
    44
    规则当然只制定一遍
    而且可以用后端生成 js 代码
    mysterin
    mysterin
    Sep 21, 2016
    45
    前端:不要相信客户输入的数据
    后端:不要相信前端传送的数据
    引申:
    moyang
    moyang
    Sep 21, 2016
    46
    Node.js 后端,一个 lib 两边用 :P
    FrankFang128
    FrankFang128
    Sep 21, 2016 via Android
    47
    @guyskk 我说的是同一个逻辑 前后都要写 这个问题
    xiongbiao
    xiongbiao
    Sep 21, 2016
    48
    共用一套 json schema 嘛
    srx1982
    srx1982
    Sep 21, 2016
    49
    @ersic 同感
    mingyun
    mingyun
    Oct 7, 2016
    50
    @tobeyouth 这个还没用过呢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2481 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 04:42 · PVG 12:42 · LAX 20:42 · JFK 23:42
    ♥ Do have faith in what you're doing.