Spring管理Struts action的安全问题

 

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是线程安全的。

2、使用singleton

spring配置

<bean id="login" class="sys.action.impl.LoginAction" scope="singleton" >
		<property name="sessionFatory" ref="sessionFactory_lsdl"></property>
	</bean>

测试结果

可见:1、action已经在spring容器启动的时候进行了初始化

        2、action是单例的,所以list1一直增长。

        3、重点是list2,在没有下次请求到来之前,list2引用上一次请求时所给的变量。如果某一次产生了大量数据,之后没有在再次请求,那么list2持有的资源不会被释放。

 

3、使用prototype

测试结果

每一次请求,spring都注入一个实例,action是安全的

结论:当使用spring和struts集成时,action的作用域最好使用prototype。

转载于:https://my.oschina.net/u/2997521/blog/1512396

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值