`

【Struts开发中谨慎使用全局变量】

阅读更多
前一段时间开发的项目,由于合作方的关系,近期进行了改版并重新审查了原来写的代码进行了一些重构处理。处理后的结果就是程序性能上来了但业代来了严重的问题:访问数据的乱串也就是用户a登录系统访问a自己的数据时偶尔会出现得到的数据却是b用户的,使用系统的人数越多这样的现象越是严重,以为是session中存储的信息串了,改成了cookie的(项目公司内部使用,安全问题考虑的不用太多)还是不行,又仔细检查了sql语句,语句也是正确的,哪怎么回用户得到的信息不是自己的呢??在群里问了一下一位叫做“糖醋鼻子”的朋友给了很大帮助,在他的提示中我想到了全局变量的线程安全问题。

在用Struts 1原来的项目都是使用的局部变量而局部变量是线程安全的,我改后把一些数据提出来了做成了全局的(罪魁祸首就在此)。

分析原理:
局部变量独立创建空间,它不是共享的资源。一个应用的生命周期中, 由于Struts1的 Action 是单例模式,每个Action只有一个实例处理所有的请求。这一点可以通过execute 方法中 打印 this得到证明。这样就会出现对全局变量的安全造成威胁。

总结经验:struts1 开发中谨慎使用全局变量存放数据,不安全啊!!!

扩展:使用actionForm 怎么不出现这样的问题呢?

原因: 这个Form 是通过参数形式传给action的,不存在共享变量的问题,更重要的是每一个request产生的actionForm实例也是不同的。

struts1  和 struts2  对比一下

struts2   中每一个请求产生一个新的实例对象,即使在Action中定义了很多全局变量,也不存在线程安全问题。
在处理每一个用户请求的时候,都建立一个单独的线程进行处理,值栈ValueStack也是伴随着这个单独的线程而存在的。在该线程存在过程中,可以随意访问值栈,这就保证了值栈的安全性。

在Struts 2中,ActionContext是一个局部线程,这就意味着每个线程中的ActionContext内容都是唯一的。所以不用担ruts2中 不用害怕Action的线程安全问题。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics