1. 首先Struts2 本身是安全的
其原理大概是:Strtus2会获取到用户的http请求,然后负责给每个请求实例化一个Action 对象,但是大家注意,这里的action对象和Struts1里面的action对象完全不是一个概念,struts1里面的action类就是一个servlet类,而这里的action类只是一个普通的java class。这也就是为什么Struts1里面的action是线程不安全的,而struts2里面的action是线程安全的原因。那我们在回头来看看struts2对servlet的处理和struts1有什么不同。看过前面分析的读者肯定知道,struts1的 action对servlet没有进行任何的包装,它是直接实现的Java WEB API 里面的servlet 接口。所以才会有线程安全的问题,但是struts2底层帮我们封装了Servlet,使开发人员不用直接接触Servlet。具体做法是:Strtus2截获servlet请求,然后给每个请求实例化一个Action对象,请求结束之后销毁Action对象。
2. Spring的单例模式
默认情况下Spring是单例的,所以虽然Struts2本身Action设计没有问题,但是如果在SPring中不做好配置的话,一样会导致线程问题,修改配置文件如下:
经过类似上述的配置,Struts2可以避免大部分的线程安全问题.