前一段时间开发的项目,由于合作方的关系,近期进行了改版并重新审查了原来写的代码进行了一些重构处理。处理后的结果就是程序性能上来了但业代来了严重的问题:访问数据的乱串也就是用户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的线程安全问题。
分享到:
相关推荐
3. **优化策略**:减少不必要的ActionForm,使用单例模式,优化Action类设计,避免过多的全局变量,合理使用Tiles等。 在面试中,理解这些框架的工作原理、应用场景和优化技巧是非常重要的。同时,掌握它们之间的...
不过,出于安全考虑,通常建议谨慎使用。 4. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为表达式语言,用于在视图层和模型层之间传递数据。第16章可能涵盖了OGNL的语法、变量引用以及如何在...
在DWR(Direct Web Remoting)中,注意大小写敏感性和代码深度的理解,局部变量与全局变量的管理。 【Web容器管理】 7. 清理`Web`容器时,若移除图片文件夹可能导致图片无法显示。在使用EL表达式(Expression ...
- 实现`Singleton`模式,使Action实例为全局单例,但这样可能引发并发问题,需谨慎处理。 - 使用ThreadLocal变量,每个线程都有自己独立的Action实例副本。 - 使用Spring框架的`prototype`作用域,每次请求都创建...
例如,在用户登录后,登录信息可以存储在Request范围内,然后在后续的页面中使用。然而,Request范围的属性不会在请求结束后保留,所以它们不适合存储持久性的用户信息。 3. **Session Scope**: Session范围的...