session  每个用户都可以用,如果两个用户都以同样的名字往session里存数据,会有影响的。

解决方案 »

  1.   

    session的作用范围是当前浏览器,所以两次请求时,如果数据放session,正好数据名称相同,则会受影响。建议楼主看看session,application,request,page这几个常用的jsp作用域。jsp内置对象作用域
      

  2.   

    但是我只是在需要查询个人订单的时候,才从session里面拿出来set进userID查询条件呀。也就是说我查询全部订单的时候并没有把userID放进osp里面但是我在第二次进入action的时候osp.userID就已经有值了。另外更正一下第11行if前面换行。
    @Controller("companypaymentAction")
    public class CompanyPaymentAction extends ActionSupport implements
    ServletRequestAware, ServletResponseAware{
      @Autowired
      private CompanyPaymentService paymentService;
      private OrderSearchParam osp;//getter setter
    public String selectCompanyOrderList() {
     int companyID=(Integer)session.getAttribute("companyID");
     int userID = (Integer)session.getAttribute("userID");
     osp.setCompanyID(""+companyID);
    //systeHandleBaseService.hasPermission 从数据库查找权限 if(systeHandleBaseService.hasPermission(CompanyPermissionEnums.SEARCH_ALL_ORDERS.getValue())) {
      LOG.debug("==========get all company orders============");
      List<OrderSearchResult> osrList =     this.paymentService.selectCompanyOrderList(osp);
     } else if(systeHandleBaseService.hasPermission(CompanyPermissionEnums.SEARCH_MY_ORDERS.getValue())) {
      LOG.debug("============get my orders==============");
      osp.setUserID(""+userID);
      List<OrderSearchResult> osrList =  this.paymentService.selectCompanyOrderList(osp);
     } 
     return SUCCESS;
     }
    }
      

  3.   

    但是实际情况麻烦请看一下3楼,在第二次查询的时候,我查询的全部订单,并且没有给userID给值。
      

  4.   

    你确定查询全部订单时候,走的是else if 分支了 ?  struts2是单例模式应该不会有这个问题!
      

  5.   

    你在查询全部的时候 输出一下osp.getUserID();如果没有值 ,说明你的this.paymentService.selectCompanyOrderList(osp);方法写的有问题
      

  6.   


    struts2 不是单例模式 ,你用spring了吗  是不是在注入的时候设置成单例模式了 。
      

  7.   

    嗯,查询的时候都走到了对应的if else分支。 我仔细看了下第一次查询个人订单的时候由于穿了一个userID,第二次再次查询全部订单的时候,进入action的时候userID就已经是上一次的值了
      

  8.   

    if(systeHandleBaseService.hasPermission(CompanyPermissionEnums.SEARCH_ALL_ORDERS.getValue())) {
      LOG.debug("==========get all company orders============");
      List<OrderSearchResult> osrList =     this.paymentService.selectCompanyOrderList(osp);
     }
    这个不是查询全部吗 你可以在里面加一行: osp.setUserID("");你这是由于单例模式产生的问题
      

  9.   

    嗯,查询的时候都走到了对应的if else分支。 我仔细看了下第一次查询个人订单的时候由于穿了一个userID,第二次再次查询全部订单的时候,进入action的时候userID就已经是上一次的值了那你肯定是把第一次查询的对象又返回到页面去了。
      

  10.   

    我用的struts2 我也怀疑是和单例模式有关系。
    我修改了下注解@Controller("companypaymentAction")
    @Scope("prototype")private OrderSearchParam osp;@Resource(name="orderSearchParam")
    public void setOsp(OrderSearchParam osp) {
    this.osp = osp;
    }
    @Component("orderSearchParam")
    public class OrderSearchParam{}
    好像还是不对呀
      

  11.   

    我知道这样修改,发现问题后我也是这么改的。那么怎么让它变成非单例的?
    struts2本身不是单例的 线程安全的 ,不该有这种情况的 。你是不是在哪里把它设置成单例的了 。
    比如spring 注入时候设置成单例的了。
      

  12.   

    你是用Spring注入的,没有显示指定Scope的话,默认是singleton也就是单例的,两次请求用的是一个对象,参数肯定是相互影响的了,指定Scope为prototype就可以了。
      

  13.   

    使用
    @Controller("companypaymentAction")
    @Scope("prototype")注解的action应该就是非单例的了吧?
      

  14.   

    是不是jsp上有userID文本框,第一次查询的时候赋值了,第二次查询的时候又传值回来了,所以没有set就有值了
      

  15.   

    这个问题遇到过 就是单例 和多例的问题 ,struts默认是 单例,就像静态变量,你不关闭服务器 ,操作的就是同一个。
    spring配置时 加上 prototype
    <bean id="commentAction" class="com.ramada.comment.action.CommentAction" scope="prototype">
      

  16.   

    Struts2的action貌似不是单例的吧,不同的请求过来action都是新建的。
      

  17.   

    struts2的Action的名称不可以以get开头,当你的Action以get开头这个Action在一次请求时会被执行两次,很久没用struts2了