使用统一技术
目前系统框架:后端采用restful风格的接口,前后端用json的数据格式交换。后端除了返回单个数字、字符串、布尔型等标量其他的json都要符合 ResponseData 定义的接口标准。
//JSON有三个域,其中data
String RES_CODE_FILED="code";
String RES_MSG_FILED="message";
String RES_DATA_FILED="data";
//处理结果,0标识正常,其他的为错误号 ,具体错误好参见接口中的注释
int getCode();
//处理结果的文字说明
String getMessage();
//返回数据,可以是任何类型数据包括数组,如果返回多个结果可以用Map
Object getData();
这个接口有两个具体的实现ResponseSingleData 和 ResponseMapData,在客户端接受到这个JSON时可以用 ResponseJSON 来解析。框架中JsonResultUtils 类提供了直接向HttpServletResponse写符合上述格式要求的JSON的便捷方法。所以在controller类中可以有多种方式来实现json格式的数据返回。详情可以参见framework-adapter/common
SQL注入
解决方案:
①后台程序添加过滤器,拦截请求,处理非法字符、脚本等;
②前端参数序列化,$("#表单id").serialize()简化了往后台传递数据,防止乱码错误 (主要针对未封装的ajax请求)
③数据库查:
单表查询>>直接使用框架已经提供的方法:如listObjects、getObjectById等;
复杂查询>>参数驱动SQL
通过条件标签[],外置条件插入标签{}和预处理标签来将对数据库查询的逻辑规则从代码中剥离出来。设计这个参数化驱动sql的主要目标有:
(1)避免根据输入条件进行复杂的sql语句拼接工作。目标是将前段输入的条件直接转换为Map作为参数驱动sql的参数。
(2)统一处理数据范围权限包括数据行范围和数据的列范围
如果条件只是判断输入的参数是否为空有则可以将条件省略并且同时需要省略参数列表外层的();如果这个参数仅用于判断则参数中的sql语句变量名称也要省略。举个例子:
– Map中的变量 a:‘4’、user:{name:‘先腾’}、c:notnull
select t1.col1, t1.col2
from table1 t1
where 1=1 [:(number)a| and t1.col3>:a] [user.name:name| and t1.name=:name ]
[c | and t1.col4 not null] [:e| and t1.col5 =:e]
– 转换后的语句为
select t1.col1, t1.col2
from table1 t1
where 1=1 and t1.col3>:a and t1.name=:name
and t1.col4 not null
– sql与的参数为 a:4 , name:‘先腾’
3 防止表单重复提交
解决方案:暂存、提交点击时,添加loading,请求结束关闭loading。
form.on(‘submit(formSubmit)’, function(data){
var index = layer.load(2, {shade: [0.3, ‘#EDEDED’], time: 1000});
$("#formSubmit").text(‘提交中’).attr(‘disabled’,true);
$.ajax({
……
});
return false;
});
4 常量型参数
解决方案:添加枚举类 或者配置文件,数据字典
典项问题:206应创建常量类。
if(!“206”.equals(searchColumn.get(“unitCode”))){
sql+= " [ :unitCode| and unit_code= :unitCode] ";
}
5 尽量减少特殊判断的写法,多添加非空判断
解决方案:
典项问题:== 改为 equals
if (o1.getUnitOrder() == o2.getUnitOrder()) {
return 0;
}
典项问题:未作非空判断,未直接使用框架方法
Public List listInfo(Map<String, Object> searchColumn) {
String sql = "select * from M_INCOME_DOC ";
List list = DatabaseOptUtils.listObjectsByNamedSqlAsJson(this, sql, searchColumn);
return list;
}
典项问题:像这类长字符串,使用StringBuilder替代String
6 代码尽量精简,添加注释
解决方案:
①从可读性,可扩展性,健壮性考虑,尽量减少冗余的代码,能用框架封装的尽量使用;
②减少重复代码,方法取名做到见名知意
③添加代码检测工具,自行扫描代码质量(alibaba、sonarlint)
7 涉及到多表更新、新增操作的
解决方案:一般放在Service层,开启事务,保证数据的一致性
9 表单元素验证
解决方案:先在完成数据逻辑检验,后台完成数据表操作
查看页面,去除输入框
解决方案:查看页面去除冗余的输入框和js
如收文查看页面
发文登记页面
10 减少数据库的连接操作
一个方法里面,尽量减少对数据库的操作,能合并的合并
方法复杂度
对于一个方法,需要多次调用接口的请求,可考虑线程切割,异步运行。
去除项目里面冗余的代码
无用的代码,对于关键的代码添加必要的注释,无用的数据库表清理。
非必要请求去除
检查3秒及以上的功能操作