您的位置:首页 > 编程语言 > Java开发

Spring管理Struts action的安全问题

2017-08-17 00:00 441 查看
摘要: 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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: