MySQL规约
建表
表名使用“[project或功能模块] 下划线 [实体类] 下划线 [从属信息等]”的形式进行命名,每个单词间都需要用下划线进行分割
所有字段必须有注释,枚举值类型更要说明每个数值代表的具体含义
自增主键的设置
1.无特殊需求时,主键名使用id
2.不允许为空并设为主键
3.设置自增
SQL
count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行
不得使用外键与级联,一切外键概念必须在应用层解决
性能
sql执行大于300ms的需要进行优化
ORM
数据更新时,不要更新无改动的字段,一是易出错;二是效率低;三是增加 binlog 存储
敏感信息展示
后端返回18766289569前端处理后显示187****9569
参数有效性验证
用户请求传入的任何参数必须做有效性验证 忽略参数校验可能导致:
例如:page size 过大导致内存溢出
SQL 注入
防XSS安全开发规范
所有暴露给前台的接口,都需要对参数进行校验:
对非字符串参数必须有数据类型校验。
字符串参数必须有长度校验,同时使用框架提供的工具进行XSS过滤和html转义
用户身份校验相关的cookie,必须设置成httpOnly,从而禁止通过js代码操作cookie
后端filter中统一校验前端请求的Referer值,来自非本网站域名的请求禁止访问(暴露给第三方的接口除外)
系统关键服务(涉及金钱操作或授权操作)需要进行token校验
必须有文件类型白名单校验(黑名单校验是不够的)
必须有文件大小的校验
必须有对文件名%00截断符的校验
上传文件在服务器端必须重命名后保存
文件保存路径不允许通过传入参数指定,必须保存在以下两个目录之一:
/data/TRS/nas/files/protect (保存敏感文件,nginx不可达)
/data/TRS/nas/files/public(保存公共文件,nginx可访问)
分层规约
controller职责描述
搜集参数
简单的参数验证
处理服务级别业务并调用service层
转发或重定向结果集
service职责描述
业务逻辑的实现
dao层的调用
处理事务
dao职责描述
数据库操作的实现
service/dao 层方法命名规约
获取单个对象的方法用 get 做前缀。
获取多个对象的方法用 list 做前缀。
获取统计值的方法用 count 做前缀。
插入的方法用save做前缀。
删除的方法用remove做前缀。
修改的方法用update做前缀。
OOP
在spring的环境中,bean中不要声明类属性,单例模式下会产生数据污染。
字符串处理、长度校验、时间处理等方法都有工具类,时刻想到先查找相关技能章节或询问开发导师是否有工具类后,再去自己造轮子。
避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可
所有的覆写方法,必须加@Override 注解。
反例:getObject()与 get0bject()的问题。
一个是字母的 O,一个是数字的 0,
加@Override 可以准确判断是否覆盖成功。
另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。
不能使用过时的类或方法。
说明:例如java.net.URLDecoder 中的方法 decode(String encodeStr) 这个方法已经过时,应 该使用双参数 decode(String source, String encode)。接口提供方既然明确是过时接口, 那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。
所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
网友评论