命名规范
- package所有字母必须小写,且名称为对应业务的英文;
- 实体类相关类名以表名开头;lm_sm_user,对应UserAction、UserService、UserDao
- 方法命名:
新增 -- save/create 开头
修改 -- update/modify/edit 开头
删除 -- delete 开头
查询 -- list/query/search/find/get 开头 - 页面命名:
列表页面 -- 对象_list.jsp、模块_list.jsp、模块_main.jsp
维护页面 -- 对象_edit.jsp、模块_edit.jsp - 数据库命名:IM_开头或IMCC_开头,具体项目业务表以业务开头,入CMB_;
- 严禁使用数据库关键字、保留字作为字段名,建议2个或以上有意义英文以“_”分割;字段注释明确;
- 数据库脚本统一命名:2018-08-08 营销相关.sql ,并可直接执行。
编码规范
- 提交svn的代码,不允许有打印语句;
- 所有java类中的提示需国际化;
- 严禁使用硬编码;通用常量放置到框架常量类中com.szhtp.faq.common.global.GlobalConst.java,非通用常量放置在对应模块常量类中;
- 一个方法不超过50行代码,包含注释;
- 减少单个方法的复杂度,使用if、while、for、switch语句在10个以内;
- 集合中的数据不使用时需要及时释放,特别是需要可重复使用的集合;
- 日志需要清晰易懂,涉及到数据库操作的功能尽量打印日志,敏感信息不能明文(统一进行异常日志封装)
- 明确方法功能,精确实现方法涉及;一个函数只做一个功能;
- 数据库操作、IO操作等需要使用close()的对象,必须在finally中close();
- 异常捕获后,如果不对异常进行处理,应记录日志或e.printStackTarce();自己抛出的异常必须要有详细的说明信息;
- 修改Bug需要有完整的修改历史说明:包含修改人、修改时间、修改原因、修改记录;以及开始和结束,需要修改的代码不能删除,只能注释;
- HQL语句一律写到DAO层中,且只能使用绑定变量;
- 运营后台涉及到数据库修改操作的URI请求一律只接受POST,且方法头需要增加@Token注释,提交的请求需带上Token;
@Token
@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView updateEntity(@ModelAttribute("demoModel") @Valid DemoModel demo,BindingResult result) throws Exception
- 涉及到数据权限的业务方法参数必须带有操作用户对象,且第一个参数必须是数据权限数据对象,最后一个参数是操作用户;入查询客户列表功能,在DAO层调用的方法参数:
public List<ImSmCustomer> listCustomers(ImSmCustomer customer, ImSmUser user);
- 涉及到数据库操作的功能,必须启用事物;
- 定义的接口参数尽量采用对象,而不是对象里的属性;
- 复杂SQL语句,只能写到对应模块的hbm配置文件中;
注释规范
- 源码注释量通常要达到30%,需准确、易懂、简洁;
- 注释类:
/**
* 类使用简介
*@(#)$CurrentFile *版权声明XXXXXX公司,版权所有违者必究*
*Company:XXXXXX公司 Copyright(c)2010
*@author:
*创建时间
*@version1.0
*修改编号:
* 时间
* 修改人
*修改原因:
*修改的方法:
*/
- 方法注释
/**
*一句话功能简介
*功能详细描述
* @param children
* @author
* @since
*/
- 类属性注释
/**
* 注释内容
*/
- 对变量的定义和分支语句(条件、循环)必须要有注释;
- 边写代码边注释,修改代码同时修改注释,保证代码与注释一致性,不再使用的注释要删除;
数据库开发及安全规范
- 敏感信息一律不得明文存储在数据库中,页面展示:身份证420***123;
- 数据库串、账号、密码必须采用密文方式;
- 严禁直接在SQL或HQL中写死条件(id=1),要数据绑定变量;
- 在大表存在复杂的关联查询中,一定要检查SQL语句,避免全表查询;避免使用未建索引的列作为查询条件;
- 涉及到数据量大的表需要分区,建立适合的分区索引而非全局索引;
- 查询条件中严禁对列做函数处理,如:ABS(列名) > 500 、to_char(时间列,'yyyy-MM-dd')>'2015-07-14';
- 尽量少使用导致全表扫描的关键字,如:like "%?%"、or、in、not in ;
页面规范
- 输入框必须长度及内容控制,同时trim空格;
- textarea 框需要明确提示可输入长度,并根据输入内容自动计算可输入长度及超过长度的截取;
- 条件联动采用ajax方式,不能刷新页面;
- 所有按钮提交涉及到数据变化的操作,需及时控制按钮可操作性(灰化按钮),提交完成后恢复按钮可操作;
- 针对有疑问的字段维护时需要有tips提示功能;
- 在进行有危险性的操作(删除、修改)之前,必须给予明确的警告、提示说明等;
- 界面不能出现横向滚动条;
- 维护界面统一屏蔽右键刷新;
- JSP中js具有通用性的代码放置到common.js中引用;
- 严禁页面js中包含${msg}方式;
- 请求中严禁使用易猜测参数作为条件(http://***?id=1),需使用唯一code替换,最好是UUID这种无规则字符串;
- 所有页面设计到提示的地方均采用国际化方式,使用spring:message标签,相关配置按照对应模块划分,配置文件路径:resources\i18n\local\messages_zh_CN.properties;
- 界面统一相关操作名称、图标(如:编辑、删除、新增、详情)等等
<spring:message code="common.add"/>
<spring:message code="common.edit"/>
<spring:message code="common.delete"/>
<spring:message code="common.view"/>
<spring:message code="common.save"/>
<spring:message code="common.search"/>
- JSP 页面不写CSS;
- JSP页面不写Java代码;
其他
- 项目统一采用UTF-8编码;
- 必须采用面向接口的3层开发模式,业务层只能处理业务,数据层只能处理数据;
- 新功能的开发一律需要先记录数据库脚本以及访问地址信息,提交SVN前对应脚本也要提交;
- 数据库脚本中涉及到ID值使用:表序列.nextval 代替(Oracle写法);
- 数据库脚本首行明确注明提交人和时间;若是数据库修改,需描述变更原因;
--------------------------------------------------------------------
---修改人信息
---原因备注
--------------------------------------------------------------------
- 工具类统一放置到通用package的工具包下,如:com.szhtp.common.util.**;
- 界面上字典、组织机构、来话原因等条件或text类型数据来源对应自定义标签;
- 所有按钮、链接等涉及到服务端请求的操作需要加上自定义权限标签用于控制可见性!
- jsp页面存放路径以package为单位;
- 测试代码一律不准提交到SVN,特别是main函数;
定制项目
- SVN路径:https://192.168.1.142/svn/proj
-
新增各自项目文件夹,并在该文件夹下新增至少2个文件document、source,在source下新增trunk与branches,如图
web安全
- XSS 跨站脚本攻击
方案:客户端、服务端字段长度校验、过滤请求中的危险字符或者转义;在页面<script>标签中不能使用${msg}方式; - CRSF 跨站点伪造请求
源于web的隐式身份验证机制,如:登录后打开一个危险网站
方案:针对敏感请求采用Token进行验证;
关键的提交请求表单使用图片验证码。
注意:不能将Token放入到cookie,存在cookie被窃取的风险; - SQL注入
方案:绑定变量 - 文件上传漏洞
文件上传的Web程序未对文件类型和格式做合法性校验,导致攻击者可以上传Webshell或者非期望格式的文件;
方案:
1)对上传文件的大小和类型进行校验,定义上传文件类型白名单;
2)保存上传文件的目录不提供直接访问; - 安全参数
严禁使用明文参数值,如id=123等;需采用无规则参数替换明文(数据库主键字段采用字符串方式)