美文网首页
Web开发中常见的坑

Web开发中常见的坑

作者: 拾壹北 | 来源:发表于2017-03-28 19:51 被阅读81次

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
明文存储
拖库
解决办法:加密存储:敏感信息存储服务,秘钥集中管理

相关文章

网友评论

      本文标题:Web开发中常见的坑

      本文链接:https://www.haomeiwen.com/subject/jbhsottx.html