- 驗證身份的時候,依賴的是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 Falsereturn 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 濫用情況。
?
?