当前位置: 首页 > news >正文

贵州门户网站建设郑州 网站建设 东区

贵州门户网站建设,郑州 网站建设 东区,宠物医生免费咨询,新手怎么开网店分享是最有效的学习方式。 博客#xff1a;https://blog.ktdaddy.com/ 老猫的设计模式专栏已经偷偷发车了。不甘愿做crud boy#xff1f;看了好几遍的设计模式还记不住#xff1f;那就不要刻意记了#xff0c;跟上老猫的步伐#xff0c;在一个个有趣的职场故事中领悟设计模… 分享是最有效的学习方式。 博客https://blog.ktdaddy.com/ 老猫的设计模式专栏已经偷偷发车了。不甘愿做crud boy看了好几遍的设计模式还记不住那就不要刻意记了跟上老猫的步伐在一个个有趣的职场故事中领悟设计模式的精髓吧。还等什么赶紧上车吧。 故事 办公室里小猫托着腮帮对着电脑陷入了思考。就在刚刚他接到了领导指派的一个任务业务调整登录方式要进行拓展。例如需要接入第三方的微信登录企业微信授权登录等等。 原因大概是这样现在大环境不好原来面向B端企业员工的电商业务并不好做新客拓展比较困难业务想要有更好的起色着实比较困难所以决策层决定要把登录的口子放开原来支持手机密码登录以及手机验证码进行登录现在为了更好地推广需要支持微信扫码关注企业公众号后登录企业微信微博等等一些列的第三方登录模式。 说白了未来到底会有多少种登录方式不得而知那么面对这样一个棘手的问题小猫又该何去何从 概述 登录问题相信后端小伙伴都有接触过最简单的可能就是做一个权限系统就会用到登录名密码验证码进行登录继而稍微复杂一些可能会涉及手机验证码登录。现在随着第三方平台的层出不穷我们很多网站其实都提供了联合登录。用户掏出手机简单地一个扫码动作即可完成初步的注册登录功能。这种方式一定程度上能够给当前的网站带来更多的流量。 关于小猫遇到的问题咱们尝试从下面几个点去解决。 登录演化 聊到登录我们首先去了解一下整个登录认证的发展阶段以及目前比较常见也相对比较复杂的微信公众号授权登录流程。 基于Cookie/Session进行验证登录 在早期也就是可能是单体系统的时代亦或者站在java开发者角度来说是jsp时代的时候我们用的登录方式就是Cookie/Session验证的方式。关于Cookie以及Session相信很多后端的小伙伴都应该知道当然若真有不清楚的大家可以自己查阅一下相关资料。 利用这种方式登录的流程其实还是比较简单的如下流程 基于上述登录成功后服务端将用户的身份信息存储在Session里并将session ID通过cookie传递给客户端。后续的数据请求都会带上cookie服 务端根据cookie中携带的session id来得到辨别用户身份。 简单的java伪代码如下 ... session.setAtrrbuite(user,user); ... session.getAttrbuite(user);当然上述的伪代码还是基于最最原始的写法去写的关于这种登录的框架其实目前市面上也有比较成熟的例如轻量级的shirospring本身自带的权限认证框架也有。 随着业务的发展系统访问量级的增大我们渐渐发现这种方式存在着一些问题 由于服务端需要对接大量的客户端也就需要存放大量的Seesion ID这样就会导致服务器压力过大。如果服务器是个集群为了同步登录的状态需要将Session ID同步到每一台服务器上无形中增加了服务器端的维护成本。由于Session ID存放在Cookie中所以无法避免CSRF攻击跨站请求伪造。 当然其他问题也欢迎小伙伴们进行补充。 为了解决这一些列的问题我们渐渐演化出了另外一种登录认证方式————基于token进行认证登录。 基于TOKEN进行认证登录 现在的系统大部分都是前后端分离开发的。后端大多使用了WEB API此时token无疑是处理认证的最好方式。 Session 方案中用户信息以Session记录形式存储在服务端。而Token方案中以Token形式存储在客户端服务端仅验证Token合法性即可。基于Token的身份验证是无状态的不将用户信息存在服务器中。这种概念解决了在服务端存储信息时的许多问题。NoSession意味着咱们的程序可以根据需要去增减机器而不用去担心用户是否登录。 咱们一起来看一下如果使用TOKEN整个流程。 关于上述token机制的特点有以下几点 无状态、可扩展在客户端存储的Token是无状态的并且能够被扩展。基于这种无状态的和不存储Session信息所以不会对服务器端造成压力负载均衡器能够将用户信息从一个服务器传到其他服务器上即使是服务器集群也不需要增加维护成本。 可扩展性Tokens能够创建与其它程序共享权限的程序。即我们所说的第三方平台联合登录的时候token的生成机制以及验证可以由第三方系统进行联合验证登录 安全性请求中发送Token而不是发送Cookie能够防止CSRF跨站请求伪造。即客户端使用Cookie存储了TookenCookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中让我们少了对Session的操作。Token也可以存放在前端任何地方可以不用保存在Cookie中提升了页面的安全性。Token是会失效的一段时间之后用户需要重新验证。 多平台跨域对应用程序和服务进行扩展的时候需要介入各种各种的设备和应用程序。只要用户有一个通过了验证的token数据和资源就能够在任何域上被请求到。 微信扫码跳转公众号认证登录 这也是后续小猫遇到的问题以及需要和其他第三方Api主要对接的。其实关于扫码认证登录也是基于token机制的一种拓展。只不过第三方的平台在token机制上新增了获取二维码进行二次确认的过程。咱们以微信扫码跳转公众号登录为例来看一下整个流程。其他的第三方登录流程其实也是大同小异咱们了解一个流程即可不同的平台只是对接不同的api而已。流程图如下 从上面这幅图看到扫码登录其实复杂就复杂在获取token这个步骤上当获取完毕token之后其后续的业务逻辑其实基本也是一样的。 其实其他第三方的登录其实也是大同小异最主要的难点是在如何获取token上我们只要认真看完对接的api其实问题也基本都能迎刃而解。 说明一下老猫这里绘图用了drawio工具如果想要知道老猫的绘图思路大家可以看看这里《绘图思路》 如何兼容多套 看完上述之后相信大家会对认证登录心里有杆秤了。细节方面其实只要去查询相关平台的api然后去撸代码就好了。但是实现一套倒是还好但是现在小猫遇到的问题是需要在原逻辑上去丰富登录的代码。如果在老的代码上通过if else的方式去实现多套登录逻辑那估计后面又是屎山。 这里其实我们可以引入“适配器设计模式”去解决这样的问题。 什么是适配器模式 适配器模式英文名Adapter Pattern是指将一个类的接口转换成用户期望的另一个接口使得原本接口不兼容的类可以一起工作。 适配器模式可以分为两类对象适配器模式和类适配器模式。对象适配器模式通过组合实现适配而类适配器模式则通过继承实现适配。 此外还有一种特殊的适配器模式——缺省适配器模式它由一个抽象类实现并在其中实现目标接口中所规定的所有方法但这些方法的实现通常是空方法由具体的子类来实现具体的功能。适配器模式的应用可以提高代码的复用性和可维护性同时帮助解决不同接口之间的兼容性问题。 上面的概念比较抽象其实在咱们的日常生活中也有这样的例子例如手机充电转换头显示器转接头等等。 适配器模式重构第三方登录 话不多说直接开干,我们就针对小猫的遇到这个第三方登录的场景咱们用代码重构一把。当然这里我们侧重的还是伪代码。跟着老猫咱们一步步走好代码的演化。 咱们先看一下老的业务代码如下 public class UserLoginService {public ApiResponseString regist(String userName,String password) {//...dosomethingreturn ApiResponse.success(success);}public ApiResponse login(String userName, String password) {return null;} }接下来由于小猫的业务会发生变更新的登录方式会层出不穷所以我们得遵循之前提到的软件设计原则去更好地写一下业务代码。我们遵循之前提到的开闭原则于是我们迈出了重构代码的第一步我们将创建一个新的第三方登录的类来专门处理第三方的登录对接。如下 public class ThirdPartyUserLoginService extends UserLoginService {public ApiResponse loginForQQ(String openId) {/*** openid 全局唯一咱们直接作为用户名* 默认密码QQ_EMPTY* 注册(原来父类中有注册实现)* 调用原来的登录*/return loginForRegist(openId, null);}public ApiResponse loginForWechat(String openId) {return null;}public ApiResponse loginForToken(String token) {return null;}public ApiResponse loginForTel(String tel, String code) {return null;}public ApiResponseString loginForRegist(String userName, String password) {super.login(userName, password);return super.login(userName, password);} }写到这里其实咱们已经集成了多种登录方式的代码兼容但是这种实现方式显然是不太优雅的看起来比较死板在登录的时候我们甚至还得去判断客户到底是用什么去做登录的然后去分别调用不同第三方平台的认证方式。 我们接下来演化开始用适配器。如下代码 首先我们定义出一个标准的适配接口 public interface LoginAdapter {boolean support(Object adapter);ApiResponse login(String id,Object adapter); }根据上面我们看到我们有QQ方式登录有微信方式登录有电话验证码方式登录。所以我们对应的就应该有相关的这些方式的适配器的实现。由于代码重复所以在此老猫就写QQ和微信这两种伪代码其他的暂时先偷个懒。 /*** author 公众号程序员老猫* date 2024/3/3 22:47*/ public class LoginForQQAdapter implements LoginAdapter {Overridepublic boolean support(Object adapter) {return adapter instanceof LoginForQQAdapter;}Overridepublic ApiResponse login(String id, Object adapter) {return null;} }public class LoginForWeChatAdapter implements LoginAdapter {Overridepublic boolean support(Object adapter) {return adapter instanceof LoginForWeChatAdapter;}Overridepublic ApiResponse login(String id, Object adapter) {return null;} } 有了这些适配器之后我们就统一对外给出去接口 public interface IPassportForThird {ApiResponse loginForQQ(String openId);ApiResponse loginForWechat(String openId);ApiResponseString loginForRegist(String userName, String password); }最后创建统一适配器。 Slf4j public class PassportForThirdAdapter extends UserLoginService implements IPassportForThird{Overridepublic ApiResponse loginForQQ(String openId) {return doLogin(openId,LoginForQQAdapter.class);}Overridepublic ApiResponse loginForWechat(String openId) {return doLogin(openId,LoginForWeChatAdapter.class);}Overridepublic ApiResponseString loginForRegist(String userName, String password) {super.login(userName, password);return super.login(userName, password);}//用到简单工厂模式以及策略模式private ApiResponse doLogin(String openId,Class? extends LoginAdapter clazz) {try {LoginAdapter adapter clazz.newInstance();if(adapter.support(adapter)){return adapter.login(openId,adapter);}}catch (Exception e) {log.error(exception is,e);}return null;} }最终我们看一下实现的类图 上述我们就用了适配器的模式简单重构了现有的第三方登录的代码当然上述可能还存在一些代码的缺陷大家也不要太过较真在此给大家在日常开发中多点思路。 大家可能会对每个适配器的support()方法有点疑问用来决断兼容。这里support()方法的参数也是Object类型的而support()方法来自接口。适配器的实现并不依赖接口其实我们也可以直接将LoginAdapter移除。 在上述重构的例子中其实咱们不仅仅用到了适配器模式其实还用到了简单工厂模式的特性。 总结 其实在我们日常的开发中适配器模式是比较常用的一种设计模式不仅仅使用上述场景其实在很多其他api的对接的场景也有适用。例如在电商业务场景中会涉及到各种对接说到买卖就会牵扯到供应商的对接第三方分销渠道客户的对接其中必然涉及模型不一致需要适配转换的场景比如供应商商品信息和标准商城商品信息等等。当然老猫在此也只是做了一下简单罗列。希望大家在后面的工作中可以参考用到。
http://www.hkea.cn/news/14278749/

相关文章:

  • 公司做网站的价格几千元网页设计个人信息
  • 网站建设开发教程做戒指网站的logo照片
  • 湖北建设厅网站查询网站seo快速优化
  • 销售型网站营销目标半夜一分快三app推荐直播下载
  • 西宁网站建设开发公司网站静态化
  • 网站开发流程图软件电影网站排名怎么做
  • 深圳建筑人才网官方网站深圳高端平台
  • 平价网站平价网站建设建设怎么利用网站赚广告费
  • 好用的网站链接一个域名怎么做多个网站
  • 旅游网站的设计与实现开题报告湖南平台网站建设推荐
  • 无水印做海报的网站思而忧网站
  • 福建省住房与城乡建设厅网站html家乡网站设计
  • 长沙专业网站建设运营怎么做电玩网站
  • 建设银行官方网站电子银行登录少儿编程加盟店排名
  • 做网站维护是什么岗位wordpress好用主题
  • 网站开发用的工具小众电商平台有哪些
  • 二级学院网站建设方案wordpress极验验证注册
  • 做网站是不是要有数据库中国域名交易网
  • 用 asp net 做 的网站山东关键词网络推广
  • 作文网站源码中关村在线手机参数对比
  • 南京网站排名优化费用用php做的网站前后台模板
  • 做3d图的网站有哪些软件有哪些临安做网站的公司有哪些
  • 怎么在百度自己创网站定制网络营销计划
  • 门户网站建设美丽网站建设 南京
  • 深圳企业网站建设报价网上能注册公司吗怎么注册
  • 做百科的网站注销公司需要多少钱
  • 网站开发 方案 报价单wap网站是什么意思啊
  • 成都网站seo性价比高wordpress网站域名服务器
  • 网站绑定域名建设银行官方网站打不开
  • 网站建设课程设计报告wordpress要装iis吗