Web开发中常见的坑

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,622评论 18 399
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 4,361评论 4 50
  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 1,258评论 0 4
  • 来源与:阿里云栖 禁止用于商业用途 ps:如果需要电子书 评论你们邮箱 我会发给你们 下面感觉还是有点乱 目录 一...
    小向资源网阅读 7,583评论 0 12
  • (一) “昔我往矣,杨柳依依;今我来思,雨雪霏霏。” “祁安哥哥!祁安哥哥!你快听,广法禅院里的和尚又在唱歌了,真...
    枳淮南阅读 7,417评论 6 10