struts 是大学毕业那会刚进公司时用过的,当时属于依样画葫芦,只会用,不知其中深浅。后来转向tapestry,struts自认为只是入门级。
最近在几个项目里跑,在某个项目中发现了struts的一个安全性问题是值得注意的。以前一直没有在意。因为过去的模式是前台页面数据通过actionForm传入,action中的excute方法接收,这个问题是不存在的。
但是,如果在action 中直接定义实例变量,问题就很大了。原因其实也很简单:
[quote]
为了确保线程安全(thread-safe),在一个应用的生命周期中,Struts框架只会为每个Action类创建一个Action实例。所有的客户请求共享一个Action实例,并且所有请求线程可以同时执行它的execute()方法。
所以,每个action只有一个实例, 在action打印this也可以看到, 确实是一样的,
所以, 不要在Action里面生命全局的变量记忆数据, 没有意义而且不安全。
[/quote]
使用actionForm则不会有问题,原因也很简单:
actionForm 是通过参数形式传入action的,不存在共享变量的问题,其实每个request产生的actionForm实例也是不同的。
尽管这年代已经使用 spring +tapestry或 jsf了,java也有线程同步机制,不过线程安全性还是需要考虑的。
最近在几个项目里跑,在某个项目中发现了struts的一个安全性问题是值得注意的。以前一直没有在意。因为过去的模式是前台页面数据通过actionForm传入,action中的excute方法接收,这个问题是不存在的。
但是,如果在action 中直接定义实例变量,问题就很大了。原因其实也很简单:
[quote]
为了确保线程安全(thread-safe),在一个应用的生命周期中,Struts框架只会为每个Action类创建一个Action实例。所有的客户请求共享一个Action实例,并且所有请求线程可以同时执行它的execute()方法。
所以,每个action只有一个实例, 在action打印this也可以看到, 确实是一样的,
所以, 不要在Action里面生命全局的变量记忆数据, 没有意义而且不安全。
[/quote]
使用actionForm则不会有问题,原因也很简单:
actionForm 是通过参数形式传入action的,不存在共享变量的问题,其实每个request产生的actionForm实例也是不同的。
尽管这年代已经使用 spring +tapestry或 jsf了,java也有线程同步机制,不过线程安全性还是需要考虑的。