开发小同学的骚操作,还好被我发现了

大家好,我是程序员鱼皮。今天给朋友们还原一个我们团队真实的开发场景。

开发现场

最近我们编程导航网站要开发 用户私信 功能,第一期要做的需求很简单:

  1. 能让两个用户之间 1 对 1 单独发送消息
  2. 用户能够查看到消息记录
  3. 用户能够实时收到消息通知
开发小同学的骚操作,还好被我发现了

这其实是一个双向实时通讯的场景,显然可以使用 WebSocket 技术来实现。

团队的后端开发小 c 拿到需求后就去调研了,最后打算采用 Spring Boot Starter  快速整合 Websocket 来实现,接受前端某个用户传来的消息后,转发到接受消息的用户的会话,并在数据库中记录,便于用户查看历史。

小 c 的代码写得还是不错的,用了一些设计模式(像策略模式、工厂模式)对代码进行了一些抽象封装。虽然在我看来对目前的需求来说稍微有点过度设计,但开发同学有自己的理由和想法,表示尊重~

开发小同学的骚操作,还好被我发现了

前端同学小 L 也很快完成了开发,并且通过了产品的验收。

看似这个需求就圆满地完成了,但直到我阅读前端同学的代码时,才发现了一个 “坑”。

开发小同学的骚操作,还好被我发现了

这是前端同学小 L 提交的私信功能代码,看到这里我就已经发现问题了,朋友们能注意到么?

开发小同学的骚操作,还好被我发现了

解释一下,小 L 引入了一个 nanoid  库,这个库的作用是生成唯一 id。看到这里,我本能地感到疑惑:为什么要引入这个库?为什么前端要生成唯一 id?

难道。。。是作为私信消息的 id?

果不其然,通过这个库在前端给每个消息生成了一个唯一 id,然后发送给后端。

开发小同学的骚操作,还好被我发现了

后端开发的同学可能会想:一般情况下不都是后端利用数据库的自增来生成唯一 id 并返回给前端嘛,怎么需要让前端来生成呢?

这里小 L 的解释是,在本地创建消息的时候,需要有一个 id 来追踪状态,不会出现消息没有 id 的情况。

首先,这么做的确 能够满足需求 ,所以我还是通过了代码审查;但严格意义上来说,让前端来生成唯一 id 其实不够优雅,可能会有一些问题。

前端生成 id 的问题

1)ID 冲突:同时使用系统的前端用户可能是非常多的,每个用户都是一个客户端,多个前端实例可能会生成相同的 ID,导致数据覆盖或混乱。

2)不够安全:切记,前端是没有办法保证安全性的!因为攻击者可以篡改或伪造请求中的数据,比如构造一个已存在的 id,导致原本的数据被覆盖掉,从而破坏数据的一致性。

要做这件事成本非常低,甚至不需要网络攻击方面的知识,打开 F12 浏览器控制台,重放个请求就行实现:

开发小同学的骚操作,还好被我发现了

3)时间戳问题:某些生成 id 的算法是依赖时间戳的,比如当前时间不同,生成的 id 就不同。但是如果前端不同用户的电脑时间不一致,就可能会生成重复 id 或无效 id。比如用户 A 电脑是 9 点时生成了 id = 06030901,另一个用户 B 电脑时间比 A 慢了一个小时,现在是 8 点,等用户 B 电脑时间为 9 点的时候,可能又生成了重复 id = 06030901,导致数据冲突。这也被称为 “分布式系统中的全局时钟问题”。

明确前后端职责

虽然 Nanoid 这个库不依赖时间戳来生成 id,不会受到设备时钟不同步的影响,也不会因为时间戳重复而导致 ID 冲突。根据我查阅的资料,生成大约 10 ^ 9 个 ID 后,重复的可能性大约是 10 ^ -17,几乎可以忽略不计。但一般情况下,我个人会更建议将业务逻辑统一放到后端实现,这么做的好处有很多:

  1. 后端更容易保证数据的安全性,可以对数据先进行校验再生成 id
  2. 前端尽量避免进行复杂的计算,而是交给后端,可以提升整体的性能
  3. 职责分离,前端专注于页面展示,后端专注于业务,而不是双方都要维护一套业务逻辑

我举个典型的例子,比如前端下拉框内要展示一些可选项。由于选项的数量并不多,前端当然可以自己维护这些数据(一般叫做枚举值),但后端也会用到这些枚举值,双方都写一套枚举值,就很容易出现不一致的情况。推荐的做法是,让后端返回枚举值给前端,前端不用重复编写。

开发小同学的骚操作,还好被我发现了

所以一般情况下,对于 id 的生成,建议统一交给后端实现,可以用雪花算法根据时间戳生成,也可以利用数据库主键生成自增 id 或 UUID,具体需求具体分析吧~


以上就是本期分享,干饭去了 🍚~ 我们私信功能刚上线,估计 Bug 不少,欢迎小伙伴们使用和反馈建议,鱼皮原创的项目教程都在编程导航:https://code-nav.cn

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

我的编程学习小圈子

用户破万了!

鱼皮的 Java 学习路线《速览版》

面试官问我为啥用这个技术?我:只学了这个!

因为不会上线项目,我面试挂了。。

25 届秋招交流群,就差你了快来!

要来了我们实习生的简历,仅供参考。。

本内容观点仅代表发布作者本人观点立场,欣文网平台只做信息内容展示和存储。发布作者:全网转载,转转请注明出处:https://www.xinenw.com/18418

(0)
上一篇 2024年6月3日 19:34
下一篇 2024年6月4日 00:59

相关推荐

  • “全网想嫁的男人”悄悄结婚,孩子都有俩了?

    ▣公号:GirlDaily(ID:kaishi09)作者:Gigi 这届观众对于《甄嬛传》的考古,已经从戏里蔓延到戏外了。 最近,有眼尖的网友发现,温太医居然演过TVB剧,还和孙太医同居了!? 好癫的联想!但仔细一看,还真是—— 张晓龙,《甄嬛传》里温润如玉的温实初,沈眉庄孩子他爹👇 林保怡,《金枝欲孽》里情深不已的孙白杨,最后和玉莹双双殉情👇 两大经典清朝…

    2024年6月15日
    10700
  • 恶魔酱女友被NTR走了?一款实用性表现出色的RPG黄油

    BBQ大好き社的第二作《恶魔酱的五日恶戏》,游戏首发于21年6月,在DLsite平台销量突破了1.2W,23年1月20日在Steam上发售(PS:本作不锁区)。从《恶魔酱的五日恶戏》开始BBQ大好き社的游戏逐渐以NTR为主要卖点,并开始了ASMR业务,《恶魔酱的五日恶戏》在同年8月也发行了配套的音声作品。 游戏剧情 身为冒险家的男主和契约恶魔兼女友的雅思兰莉…

    2024年9月6日
    1900
  • 贾玲代言Prada,网友最担心的事要发生了?!

    “我是Prada,我重生了。前世,我被内娱陷害,火灾,塌房,一次又一次找上我,我被发到网上群嘲,大家都说我有毒。重活一世,我不再相信内娱,努力混进电影圈,这次,失去的一切我要全部夺回来”   历史总是惊人的相似,是时候再次把这段话搬出来了。   原来Prada正式给了贾玲一个名分。   Prada官微官宣贾玲成为品牌代言人,票房女王变穿Prada的女王,全网…

    2024年6月5日
    11900
  • 景区路边摊的臭豆腐,到底有多脏

    无论是在老家的商业街,还是在千百公里外的旅游景区,你一定都能发现臭豆腐的身影。 臭豆腐以其独特的风味,牢牢抓住其追随者的味蕾,在中国小吃的江湖混战中霸占一席之地。  不过,这些街头随处可见的臭豆腐,真的能放心吃吗?   臭豆腐主要分为两类,一种是发酵型臭豆腐,也就是我们经常在超市里见到的瓶装臭豆腐,民间俗称“青方”;另一种是非发酵型臭豆腐,也叫油炸臭豆腐,一…

    2024年5月1日
    15900
  • 清华博士送水泥戒指求婚,爱意表达并非物质的堆砌

    许梦萍 西南科技大学 ——2024年度红网“青椒计划”系列作品 6月3日,#清华博士送水泥戒指求婚被嘲笑#的话题登上了微博热搜。清华大学一博士生用水泥戒指向女朋友求婚,水泥戒指用的是他所发明的防水材料。评论区对此却褒贬不一,有人嘲笑他是“水泥哥”,认为他应该把顶级专利送给女朋友才配求婚。还有网友说:“科研成果是成果,炫耀一下是可以的,但拿来当结婚戒指就有点可…

    2024年6月5日
    11000

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件A:xinenw@qq.com

邮箱B:xinenw@163.com

工作时间:周一至周五,8:30-23:30;周六周日10:30-18:30;节假日休息

关注微信
欣文网内容建设升级中,欢迎您参与意见征集进行评论,只为打造更好的内容平台!