但是我的系统在不同的电脑中用同一个帐户登录进去,居然共用了一个session,
还有action中定义的在页面中显示的list变量也共用了,
是我的spring中设置的问题?还是我的写法问题?请教大家,谢谢!我的session中是个Hashtable
ActionContext.getContext().getSession().put(keyName, hashtable);
ActionContext.getContext().getSession().get(keyName);
这里我觉得不同的浏览器即使keyName相同,session应该也不一样才对,
后来我把keyName后面加了sessionId,取值问题解决了,
但是action中定义的list又冲突了,
2个电脑的页面,同一个帐户登录,进同一个页面,更改了一个,另外一边数据刷新下就跟着改了,
郁闷。
还有action中定义的在页面中显示的list变量也共用了,
是我的spring中设置的问题?还是我的写法问题?请教大家,谢谢!我的session中是个Hashtable
ActionContext.getContext().getSession().put(keyName, hashtable);
ActionContext.getContext().getSession().get(keyName);
这里我觉得不同的浏览器即使keyName相同,session应该也不一样才对,
后来我把keyName后面加了sessionId,取值问题解决了,
但是action中定义的list又冲突了,
2个电脑的页面,同一个帐户登录,进同一个页面,更改了一个,另外一边数据刷新下就跟着改了,
郁闷。
struts提供两种方式访问session和request,其中比较常用的是利用SPRING里面所说的IOC即控制反转
IOC方式:
action类实现ServletRequestAware接口,并新建一个HttpServletRequest request
public class UserLoginAction extends ActionSupport implements ServletRequestAware{
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
然后可以生成的request得到对象,如request.getRemoteAddr()
action类实现SessionAware接口,并创建一个MAP对象session
public class UserLoginAction extends ActionSupport implements ServletRequestAware,SessionAware{
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public void setSession(Map session) {
this.session=session;
}
非IOC方式
非Ioc方式这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
获得request对象:
A . HttpServletRequest request = ServletActionContext.getRequest ();
B.ActionContext ct= ActionContext.getContext()
HttpServletRequest request=
(HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST );
获得session对象:
在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。
A.Map session=ActionContext.getSession();
B.Map session=(Map)ActionContext.getContext().get(ActionContext.SESSION);
得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。
但是如果你的工程使用了spring 的bean 工厂管理的时候 默认的scope属性值 是singleton 就是初始化 IOC容器的时候只会产生这个action的一个实例 ,所以需要在bean里面将 action的 scope属性设置为
<bean id="userloginAction" class="xxx.UserLoginAction" scope="prototype">
<property name="" ref=""></property>
</bean>
你看看是不是这个原因。
<property name="" ref=""> </property>
</bean>