前一段时间开发的项目,由于合作方的关系,近期进行了改版并重新审查了原来写的代码进行了一些重构处理。处理后的结果就是程序性能上来了但业代来了严重的问题:访问数据的乱串也就是用户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的线程安全问题。
分享到:
相关推荐
Struts开发技巧Struts开发技巧Struts开发技巧Struts开发技巧Struts开发技巧Struts开发技巧Struts开发技巧Struts开发技巧
Struts开发框架简介视频电脑维修项目,C#
Struts应用开发基础.doc Struts应用开发基础.doc Struts应用开发基础.doc Struts应用开发基础.doc Struts应用开发基础.doc
用于struts开发.当用eclipse开发struts时,是必不可少的插件
NULL 博文链接:https://lf6627926.iteye.com/blog/1513041
struts2开发需要用到的jar包
北大青鸟 Y2 学年 使用Struts 2框架开发租房网站
Struts开发所使用的所有java包以用Struts标签定义
struts开发需要的包,这里很全啊!
自己做的struts开发的实例,用到了前台验证,和后台的action,对初学的同志,有所帮助,因为是别人问我的,所以做好了,上传下,请大家指教。
struts开发入门与项目实践光盘源码 里面有几个struts项目案例
关于struts开发的大部分jar包都涵盖了
Struts开发模式经验总结,非常有用的经验
Struts开发中有哪几个关键对象,并分别说出这些关键对象的作用?
STRUTS开发用c标签STRUTS开发用c标签STRUTS开发用c标签STRUTS开发用c标签
jsp项目开发实录 jsp项目开发实录 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整...
本源码主要涉及了Struts 2的核心操作包、配置文件、核心开发模式的使用,在本课程讲解的时候主要结合Struts 2的核心优点以及从代码比较上讲解了和Struts 1的区别,随后又包含了Struts 2中提供的各个优秀技术,如转换...
关于STRUTS的开发
Struts开发所需要的导入的包,导入就可用于struts的开发,不然会报错