2017-03-28
基本都是Effective Java上的内容
1、对象方法
-
equals
用“值”对比对象,要覆盖Object的equals方法
-
hashcode
重写equals方法一定同时重写hashcode方法;反过来不要求
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
hashCode 的相关官方规定:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
-
toString
以Json格式输出
// IDEA中toString的template
public java.lang.String toString() {
final java.lang.StringBuilder sb = new java.lang.StringBuilder("{");
#set($i = 0)
#foreach($member in $members)#if ($i == 0)
sb.append("#####
#
else
sb.append(",####
#end# if ($member.string || $member.date)
"$member.name":"")
#else
"$member.name":")
#end#if ($member.primitiveArray || $member.objectArray)
.append(java.util.Arrays.toString($member.name));
#elseif($member.string || $member.date)
.append($member.accessor).append('"');
#else
.append($member.accessor);
#end#set($i = $i + 1)
#end
sb.append('}');
return sb.toString();
}
-
clone
clone方法是除了new之外另一个生成对象的方法;
支持clone的类必须实现Clonable接口;
注意浅拷贝和深拷贝:clone默认的是浅拷贝,即引用拷贝,修改任意一个都会对所有副本产生影响
-
Comparable
接口,表示该类支持排序,重写compareTo方法定义比较规则
-
Comparator
比较器,可对未实现Comparable的类接口排序,也可对实现了Comparable的类重新定义比较规则
-
float / double / BigDecimal
float / double计算可能丢失精度;BigDecimal要用String来构造,用compareTo比较大小
-
装箱类型
未初始化的装箱类型会报空异常
2、环境与方案问题
-
编码格式
UTF-8
-
外部资源(第三方)依赖问题
-
增加监控,设置报警
-
设置超时时间
-
任务调度
使用TC组件
-
分布式环境中的本地缓存
- Redis / memcached
- 不可取的数据更新方式:全部删除 -> 全部加载(即使再快也有数据不一致错误的可能)
- 可取的方法:逐条对比更新
- null值是否具有特殊含义?
3、并发问题
-
ThreadLocal
与线程绑定的,不同线程可取到不同的值(机理:map,线程为key,值为value);
数据要手动清理,否则引发内存泄露
4、安全问题
-
SQL注入
通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.解决办法:不要拼接SQL
-
XSS跨站漏洞
通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序,这些恶意网页程序通常是JavaScript
危害:XSS可以偷走访问者在漏洞网站的cookies(通常可以代表用户的身份);XSS可以注入一段代码让访问者执行
解决办法:参数格式校验;ESAPI.encoder().encodeForxxx
-
CSRF跨站请求伪造
伪装来自受信任用户的请求来欺骗的网站,本质就是借用用户身份来做某些操作:包括:以用户身份发送邮件,发消息,盗取用户账号,甚至购买商品
解决办法:验证HTTP Referer字段-------根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。 CSRFTOKEN(选择):在请求地址中添加token并验证,比如由于攻击者不能获得第三方的Cookie(理论上),所以可以根据某cookie构造hash值作为伪随机数;或者在HTTP 头中自定义属性并验证
-
其他安全问题
访问限制
内部使用的地址不小心对外部开放.一般要有内网,白名单,黑名单的方式保护
开发环境不允许直接连接到生产环境
数据库,cache服务器不对办公网开放
-
功能权限和数据权限
功能权限:看到不一样的功能菜单
数据权限:同样的功能看到不一样的数据
-
敏感信息
http GET
请求的参数会记录在access log中(包括手机号,订单号,身份证等)
解决办法:有敏感信息的接口用post
明文存储
拖库
解决办法:加密存储:敏感信息存储服务,秘钥集中管理
网友评论