代码优化(2)——小程序登录

  1. 验证身份的时候,依赖的是cookie里面的token
    $this->request->server('HTTP_TOKEN',$this->request->request('token', \think\Cookie::get('token')))
    小程序的交互权限验证,一般放到header里面进行鉴权,极少是通过cookie来传递参数验证。可能在开始的时候,在浏览器里面调试,cookie修改比header方便,就使用了cookie来切换身份,并不是一种规范和安全的做法。Token一般放入头部一起发送,身份鉴权类的放入头部,进行统一头部验证,比较方便

2.对于需要验证登录的身份,统一使用init($token) 进行处理,内部用户的相关信息全部被保护在啊 auth对象里面。
导致每次使用初始化登录的user_id  变成使用方法获取。开发者对变量的获取补数量,导致$this->auth->getUserinfo()['id'] 使用这种冗余的方式获取用户user_id,其实只要在api的公共部分,初始化定义一个user_id 然后被赋值,就可以全部使用,同时在auth里面初始化了一次获取用户信息后,直接赋值给全局user_info即可,如果变量不够,只在第一次初始化请求,而不用每次请求之后,再去各个API里面进行对应请求。

技巧与改动: 直接在初始化的时候,获取用户全部相关信息,然后赋值给API公共方法,这样关于该登录的用户的全部数据信息,都是通过user_info变量操作,减少不必要的再次数据请求。一般用户初始化信息之类的,都是只要初始化一次,然后如果中途用户资金之类的数据进行了变动,直接更新全局的数据接口,而不用反复反复在读取的每个方法里面,再去调用。

3.获取参数请求连接的太长,基本获取参数
 $tag = $this->request->post("tagpersonal", ''); 每个参数都要这样进行获取,而且对于一些测试协议支持比较弱,由于头部设置了只接受application/json格式,直接导致postman 提交的非json获取不到,这直接导致开发的时候,每次都要通过修改调试接口的json参数进行调试,复杂度大大提升。开发的时候,需要考虑调试人员的便捷性和自己开发的方便程度。而且没有办法对统一的输入接口,进行日志跟踪。

改进:用一个统一方法获取请求的数组,并赋值给一个变量名,在最后返回结果前,保存到日志里面。统一处理获取的参数,对于早期调试系统帮助非常大,否则出问题,非常麻烦,只能逐步断点或者查看具体原因,而有参数,能很轻松的看到前后结论。需要将参数请求部分,集中统一到一个地方,方便集中处理。

 参数的简化判断,对于多参数的接口非常有帮助,前期其实只要复制对应的方法到系统里面,也可以判断。

4.没有对参数进行统一的过滤和判断,导致只能程序里面反复判断 参数滤空非常重要,可以减少很多无意义的判断。
 

一般参数的请求情况,格式类型(PHP/python等弱语言,能对数字自动转化为字符串操作,或者直接intval即可)然后就是判断是不是空,如果是空,程序无法执行,所以必须过滤空参数的执行。空参数过滤之后,然后就是读取默认参数的默认值,有些代码是需要默认参数执行的。

所以可以写个完整的统一方法来处理参数的,XSS过滤,然后过滤空,然后执行必填参数检测,最后缺值的参数,填充默认参数。大幅度减轻参数的请求工作量,同时可以在该方法上进行相关日志记录。

过滤空参的函数方法

 function  checkNdata($arr,$fillArr=[]) {

        if(empty($arr)) return false ; //空数组直接退出

        $arr = array_filter($arr,function ($m) { return $m!='';});

        //检测字段是否存在

        if(!empty($fillArr)) {

            foreach ($fillArr as  $val) {

                if(!isset($arr[$val]))  return false;

            }

        }

        return $arr;

    }

PYTHON的实现:

def check_data(arr, fill_arr=None):

    if not arr:  # 空数组直接退出

        return False

    # 使用列表推导式过滤掉空字符串

    arr = [m for m in arr if m != '']

    # 检测字段是否存在

    if fill_arr:

        for val in fill_arr:

            if val not in arr:

                return False

    return arr

5.缓存的获取  调整TP5框架里面的快速缓存快速获取方法
\think\Cache::set($decryptSession['session_key'], $decryptSession, 24 * 3600); 这个是基本命令 其实可以直接使用cache的快捷函数 而不用自己另外来操作cache。 所以使用框架之前,需要对文档有个比较熟悉的认识,用里面的快捷方法,比自己构造另外的缓存方法要方便很多。基本上redis已经是当前开发必备,只要直接使用cache即可。
 

6.减少 if  else的嵌套一个小技巧
   代码有N重循环的时候, 如果是遇到错误退出这种 结构
  if(res) {

        xxxxx

     }  else {

      Exit()

     }

  退出报错的情况下,将错误退出的提前,这样就不需要再进行报错逻辑
if(!$res)  exit()
这样有个巨大的好处,可以大幅度减少if() {} else {}的嵌套逻辑。在以前一个案例里面有个四重逻辑
用户微信登录过  系统存在登录手机号  第一种最简单情况,表示用户就是普通登录
用户手机号不存在,但是微信登录过
用户手机号不存在  微信没有登录过
用户手机号存在,微信没有登陆过
直接使用了四层if else
if(微信登录过) {

} else {

  If(手机号存在) {

} else {

直接导致填入四种情况的登录,导致代码800行以上的登录逻辑。其实只要直接做简单判断,不需要if else 然后执行四个对应的条件就可以,大幅度简化执行结构。当前的系统也有这种if else 滥用情况。
 


 

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大梁来了

千山万水总是情,打赏一块行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值