MySQL規(guī)約
建表
表名使用“[project或功能模塊] 下劃線 [實(shí)體類] 下劃線 [從屬信息等]”的形式進(jìn)行命名铅辞,每個(gè)單詞間都需要用下劃線進(jìn)行分割
所有字段必須有注釋滥壕,枚舉值類型更要說(shuō)明每個(gè)數(shù)值代表的具體含義
自增主鍵的設(shè)置
1.無(wú)特殊需求時(shí)躏精,主鍵名使用id
2.不允許為空并設(shè)為主鍵
3.設(shè)置自增
SQL
count(*)會(huì)統(tǒng)計(jì)值為 NULL 的行,而 count(列名)不會(huì)統(tǒng)計(jì)此列為 NULL 值的行
不得使用外鍵與級(jí)聯(lián)徐勃,一切外鍵概念必須在應(yīng)用層解決
性能
sql執(zhí)行大于300ms的需要進(jìn)行優(yōu)化
ORM
數(shù)據(jù)更新時(shí)探颈,不要更新無(wú)改動(dòng)的字段,一是易出錯(cuò)刺洒;二是效率低;三是增加 binlog 存儲(chǔ)
敏感信息展示
后端返回18766289569前端處理后顯示187****9569
參數(shù)有效性驗(yàn)證
用戶請(qǐng)求傳入的任何參數(shù)必須做有效性驗(yàn)證? 忽略參數(shù)校驗(yàn)可能導(dǎo)致:
例如:page size 過(guò)大導(dǎo)致內(nèi)存溢出
SQL 注入
防XSS安全開發(fā)規(guī)范
所有暴露給前臺(tái)的接口吼砂,都需要對(duì)參數(shù)進(jìn)行校驗(yàn):
對(duì)非字符串參數(shù)必須有數(shù)據(jù)類型校驗(yàn)逆航。
字符串參數(shù)必須有長(zhǎng)度校驗(yàn),同時(shí)使用框架提供的工具進(jìn)行XSS過(guò)濾和html轉(zhuǎn)義
用戶身份校驗(yàn)相關(guān)的cookie渔肩,必須設(shè)置成httpOnly因俐,從而禁止通過(guò)js代碼操作cookie
后端filter中統(tǒng)一校驗(yàn)前端請(qǐng)求的Referer值,來(lái)自非本網(wǎng)站域名的請(qǐng)求禁止訪問(wèn)(暴露給第三方的接口除外)
系統(tǒng)關(guān)鍵服務(wù)(涉及金錢操作或授權(quán)操作)需要進(jìn)行token校驗(yàn)
必須有文件類型白名單校驗(yàn)(黑名單校驗(yàn)是不夠的)
必須有文件大小的校驗(yàn)
必須有對(duì)文件名%00截?cái)喾男r?yàn)
上傳文件在服務(wù)器端必須重命名后保存
文件保存路徑不允許通過(guò)傳入?yún)?shù)指定,必須保存在以下兩個(gè)目錄之一:
/data/TRS/nas/files/protect (保存敏感文件抹剩,nginx不可達(dá))
/data/TRS/nas/files/public(保存公共文件撑帖,nginx可訪問(wèn))
分層規(guī)約
controller職責(zé)描述
搜集參數(shù)
簡(jiǎn)單的參數(shù)驗(yàn)證
處理服務(wù)級(jí)別業(yè)務(wù)并調(diào)用service層
轉(zhuǎn)發(fā)或重定向結(jié)果集
service職責(zé)描述
業(yè)務(wù)邏輯的實(shí)現(xiàn)
dao層的調(diào)用
處理事務(wù)
dao職責(zé)描述
數(shù)據(jù)庫(kù)操作的實(shí)現(xiàn)
service/dao 層方法命名規(guī)約
獲取單個(gè)對(duì)象的方法用 get 做前綴。
獲取多個(gè)對(duì)象的方法用 list 做前綴澳眷。
獲取統(tǒng)計(jì)值的方法用 count 做前綴胡嘿。
插入的方法用save做前綴。
刪除的方法用remove做前綴钳踊。
修改的方法用update做前綴衷敌。
OOP
在spring的環(huán)境中,bean中不要聲明類屬性箍土,單例模式下會(huì)產(chǎn)生數(shù)據(jù)污染逢享。
字符串處理、長(zhǎng)度校驗(yàn)吴藻、時(shí)間處理等方法都有工具類,時(shí)刻想到先查找相關(guān)技能章節(jié)或詢問(wèn)開發(fā)導(dǎo)師是否有工具類后弓柱,再去自己造輪子沟堡。
避免通過(guò)一個(gè)類的對(duì)象引用訪問(wèn)此類的靜態(tài)變量或靜態(tài)方法,無(wú)謂增加編譯器解析成 本矢空,直接用類名來(lái)訪問(wèn)即可
所有的覆寫方法航罗,必須加@Override 注解。
反例:getObject()與 get0bject()的問(wèn)題屁药。
一個(gè)是字母的 O粥血,一個(gè)是數(shù)字的 0,
加@Override 可以準(zhǔn)確判斷是否覆蓋成功酿箭。
另外复亏,如果在抽象類中對(duì)方法簽名進(jìn)行修改,其實(shí)現(xiàn)類會(huì)馬上編譯報(bào)錯(cuò)缭嫡。
不能使用過(guò)時(shí)的類或方法缔御。
說(shuō)明:例如java.net.URLDecoder 中的方法 decode(String encodeStr) 這個(gè)方法已經(jīng)過(guò)時(shí),應(yīng) 該使用雙參數(shù) decode(String source, String encode)妇蛀。接口提供方既然明確是過(guò)時(shí)接口耕突, 那么有義務(wù)同時(shí)提供新的接口;作為調(diào)用方來(lái)說(shuō)评架,有義務(wù)去考證過(guò)時(shí)方法的新實(shí)現(xiàn)是什么眷茁。
所有的相同類型的包裝類對(duì)象之間值的比較,全部使用 equals 方法比較纵诞。