Spring管理Struts action的安全问题
2017-08-17 00:00
441 查看
摘要: Struts Action的作用域
action配置
action代码
测试结果
Struts为每一个请求使用一个action实例来处理,也就是默认情况下action是线程安全的。
![](https://static.oschina.net/uploads/space/2017/0817/214340_UwGl_2997521.png)
测试结果
![](https://static.oschina.net/uploads/space/2017/0817/215456_Fpe6_2997521.png)
可见:1、action已经在spring容器启动的时候进行了初始化
2、action是单例的,所以list1一直增长。
3、重点是list2,在没有下次请求到来之前,list2引用上一次请求时所给的变量。如果某一次产生了大量数据,之后没有在再次请求,那么list2持有的资源不会被释放。
![](https://static.oschina.net/uploads/space/2017/0817/220006_k4q0_2997521.png)
每一次请求,spring都注入一个实例,action是安全的
结论:当使用spring和struts集成时,action的作用域最好使用prototype。
1、在没有集成之前,struts本身是怎么管理的?
struts配置<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--不使用spring作为bean工厂--> <!--<constant name="struts.objectFactory" value="spring"></constant>--> <constant name="struts.devModel" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.action.excludePattern" value="/viewspc/*,/easyui152/*,/myServlet/*" /> </struts>
action配置
<action name="login" class= "sys.action.impl.LoginAction"> <result name="SUCCESS">/viewspc/logins/login.html</result> </action>
action代码
package sys.action.impl; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import sys.action.ILoginAction; public class LoginAction extends ActionSupport implements ILoginAction { private static Logger logger = Logger.getLogger(LoginAction.class.toString()); private SessionFactory sessionFatory; private static int instanceCount; private List list; private List list2; static{ instanceCount=0; } /** * */ private static final long serialVersionUID = 7384325442424101720L; public LoginAction(){ instanceCount++; list = new ArrayList(); System.out.println("LoginActin:"+instanceCount); } @SuppressWarnings("rawtypes") @Override public String execute() throws Exception { int i =(int) (Math.random()*100); int k = (int) (Math.random()*100); int size2 = (list2==null)?0:list2.size(); System.out.println("before list1:"+list.size()); System.out.println("before list2:"+size2); list2 = new ArrayList(); while(k>=0){ list2.add(Math.random()*100); k--; } while(i>=0){ list.add(i); i--; } System.out.println("after lsit1:"+list.size()); System.out.println("after list2:"+list2.size()); return "SUCCESS"; } public SessionFactory getSessionFatory() { return sessionFatory; } public void setSessionFatory(SessionFactory sessionFatory) { this.sessionFatory = sessionFatory; } }
测试结果
Struts为每一个请求使用一个action实例来处理,也就是默认情况下action是线程安全的。
![](https://static.oschina.net/uploads/space/2017/0817/214340_UwGl_2997521.png)
2、使用singleton
spring配置<bean id="login" class="sys.action.impl.LoginAction" scope="singleton" > <property name="sessionFatory" ref="sessionFactory_lsdl"></property> </bean>
测试结果
![](https://static.oschina.net/uploads/space/2017/0817/215456_Fpe6_2997521.png)
可见:1、action已经在spring容器启动的时候进行了初始化
2、action是单例的,所以list1一直增长。
3、重点是list2,在没有下次请求到来之前,list2引用上一次请求时所给的变量。如果某一次产生了大量数据,之后没有在再次请求,那么list2持有的资源不会被释放。
3、使用prototype
测试结果![](https://static.oschina.net/uploads/space/2017/0817/220006_k4q0_2997521.png)
每一次请求,spring都注入一个实例,action是安全的
结论:当使用spring和struts集成时,action的作用域最好使用prototype。
相关文章推荐
- 由Spring管理的Struts2的Action的全程安全问题
- 由Spring管理的Struts2的Action的全程安全问题
- 由Spring管理的Struts2的Action的全程安全问题
- 关于用spring来管理Struts中的action 所出现的问题
- Spring管理Struts Action
- 线程安全问题(解决) -------使用spring 的action-servlet.xml解决struts线程问题
- struts2+spring中action的生命周期问题
- 由Spring管理的Struts2的Action的单实例问题
- struts-spring-hibernate 框架 action 请求 ,form 表单提交 id 重复问题
- 解决spring+struts 找不到Action问题
- 由Spring管理的Struts2的Action的单实例问题
- Struts的Action访问spring的ApplicationContext的问题
- 如何理解Struts和Spring单例和多例,以及Action请求的问题
- struts和spring整合创建Action对象的问题?
- 使用spring 的action-servlet.xml解决struts线程问题
- struts2,spring整合中使用spring 管理struts2的action,springaop 常见问题
- 实现Spring管理struts的Action
- struts中Action的线程安全与实例变量和静态变量的共享问题
- 使用Spring的注解方式注入Struts所管理的action
- 由Spring管理的Struts2的Action的单实例问题