但是我的系统在不同的电脑中用同一个帐户登录进去,居然共用了一个session,
还有action中定义的在页面中显示的list变量也共用了,
是我的spring中设置的问题?还是我的写法问题?请教大家,谢谢!我的session中是个Hashtable
ActionContext.getContext().getSession().put(keyName, hashtable);
ActionContext.getContext().getSession().get(keyName);
这里我觉得不同的浏览器即使keyName相同,session应该也不一样才对,
后来我把keyName后面加了sessionId,取值问题解决了,
但是action中定义的list又冲突了,
2个电脑的页面,同一个帐户登录,进同一个页面,更改了一个,另外一边数据刷新下就跟着改了,
郁闷。

解决方案 »

  1.   

    request.getSession()。你这里取得是什么东西啊?不是那种意义上的session   晕
      

  2.   

    并不是所有带getSession()的东西,得到的就是我们说的请求的scope里面的session..hib也有session,oracle也有session
      

  3.   

    在struts1中,获得到系统的request或者session对象非常方便,都是按照形参传递的,但是在struts2中,request和session都被隐藏了
    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了。
      

  4.   

    这样啊,那是我不了解在乱说了,sorry。但你这里怎么又冲突了呢?
      

  5.   

    struts2 的action 对象在每一次请求的时候都会new出来一个新的action对象,是一个有状态的(有成员变量),所以多个线程是不能共享这些action的。 
    但是如果你的工程使用了spring 的bean 工厂管理的时候 默认的scope属性值 是singleton 就是初始化 IOC容器的时候只会产生这个action的一个实例 ,所以需要在bean里面将 action的 scope属性设置为 
      
    <bean id="userloginAction" class="xxx.UserLoginAction" scope="prototype"
    <property name="" ref=""></property> 
    </bean>
    你看看是不是这个原因。
      

  6.   

    也就是因为使用了spring使得多次请求使用了一个action实例,而action是有状态的,当然list里的数据就会有冲突了,不同与struts1中的action是无状态的,可以多线程访问
      

  7.   

    <bean id="userloginAction" class="xxx.UserLoginAction" scope="session"> 
    <property name="" ref=""> </property> 
    </bean>