《阿里巴巴Java开发手册(终极版)》4-1安全规约(新增)

  1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。
    说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信
    内容、修改他人的订单。

  2. 【强制】用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
    说明:查看个人手机号码会显示成:158****9119,隐藏中间 4 位,防止隐私泄露。

  3. 【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,
    禁止字符串拼接 SQL 访问数据库。

  4. 【强制】用户请求传入的任何参数必须做有效性验证。
    说明:忽略参数校验可能导致:
     page size 过大导致内存溢出
     恶意 order by 导致数据库慢查询
     任意重定向
     SQL 注入
     反序列化注入
     正则输入源串拒绝服务 ReDoS
    说明:Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,
    但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。

《阿里巴巴Java开发手册(终极版)》3-1单元测试(新增)

单元测试

  1. 【强制】好的单元测试必须遵守 AIR 原则。
    说明:单元测试在线上运行时,感觉像空气 (AIR) 一样并不存在,但在测试质量的保障上,
    却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。
     A: Automatic (自动化)
     I: Independent (独立性)
     R: Repeatable (可重复)

  2. 【强制】单元测试应该是全自动执行的,并且非交互式的。测试框架通常是定期执行的,执行
    过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测
    试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。

  3. 【强制】保持单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试用例之间
    决不能互相调用,也不能依赖执行的先后次序。
    反例: method2 需要依赖 method1 的执行,将执行结果做为 method2 的输入。

  4. 【强制】单元测试是可以重复执行的,不能受到外界环境的影响。
    说明:单元测试通常会被放到持续集成中,每次有代码 check in 时单元测试都会被执行。如
    果单测对外部环境(网络、服务、中间件等)有依赖,容易导致持续集成机制的不可用。
    正例:为了不受外界环境影响,要求设计代码时就把 SUT 的依赖改成注入,在测试时用 spring
    这样的 DI 框架注入一个本地(内存)实现或者 Mock 实现。

《阿里巴巴Java开发手册(终极版)》2-2之日志规约

异常日志 - 日志规约

  1. 【强制】应用中不可直接使用日志系统 (Log 4 j 、 Logback) 中的 API ,而应依赖使用日志框架
    SLF 4 J 中的 API ,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    private static final Logger logger = LoggerFactory.getLogger(Abc.class);
  2. 【强制】日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。

《阿里巴巴Java开发手册(终极版)》2-1之异常处理

异常日志 - 异常处理

第 1 项、第 9 项、 第 10 项、第 12 项

  1. 【强制】 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该
    通过 catch 来处理,比如: IndexOutOfBoundsException , NullPointerException 等等。
    说明:无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过 catch
    NumberFormatException 来实现。

    正例:

     if(obj != null) {...}

    反例:

     try { obj.method() } catch(NullPointerException e){...}
  2. 【强制】异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。

《阿里巴巴Java开发手册(终极版)》1-9之其它

编程规约 - 其它

  1. 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
    说明:不要在方法体内定义: Pattern pattern = Pattern . compile( 规则 );
  2. 【强制】 velocity 调用 POJO 类的属性时,建议直接使用属性名取值即可,模板引擎会自动按
    规范调用 POJO 的 getXxx() ,如果是 boolean 基本数据类型变量 (boolean 命名不需要加 is
    前缀 ) ,会自动调用 isXxx() 方法。
    说明:注意如果是 Boolean 包装类对象,优先调用 getXxx() 的方法。
  3. 【强制】后台输送给页面的变量必须加 $!{var} ——中间的感叹号。
    说明:如果 var = null 或者不存在,那么 ${var} 会直接显示在页面上。
  4. 【强制】注意 Math . random() 这个方法返回是 double 类型,注意取值的范围 0≤ x <1 ( 能够
    取到零值,注意除零异常 ) ,如果想获取整数类型的随机数,不要将 x 放大 10 的若干倍然后
    取整,直接使用 Random 对象的 nextInt 或者 nextLong 方法。
| | 总字数统计:93.5k