当前位置:编程学习 > JAVA >>

为什么两次action请求,参数相互影响!

今天在做一个查询个人订单和全部订单的功能时,发现了两次请求一个参数相互影响的问题。一直想不通,上来问问大神。
@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;
 }
}

个人订单会传一个userID过去,而全部订单则没有传递这个userID。
现在,我先查询个人订单,成功查到。然后我在数据库里面修改登录用户的权限为能查找到所有人的订单。
重新登录,debug之。打出all company orders的log。但是osp里面的userID是上一次查询个人订单时候的值。所以查询结果还是这个人的个人订单。也就是说这个查询条件osp还是上一次查询时候的值。
虽然最后我给所有订单查询的时候
osp.setUserID("");
解决了。但是还存在诸多疑问,实在是不明白为什么两次请求的参数为什么会产生影响,求大神解答。
附上其他。

 $.ajax({
url:"/companyPayment/selectCompanyOrderList.action",
type:"post",
dataType:"json",
async:false,
cache:false,
data:{
"osp.applicationUser" : $("#searchContact_name").val(),
"osp.beginTime":$("#beginTime").val(),
"osp.endTime":$("#endTime").val(),
"osp.orderStatus":$("#orderStatus").val(),
"osp.page":currentPage,
"osp.limit":true
}});
--------------------编程问答-------------------- session  每个用户都可以用,如果两个用户都以同样的名字往session里存数据,会有影响的。 --------------------编程问答-------------------- session的作用范围是当前浏览器,所以两次请求时,如果数据放session,正好数据名称相同,则会受影响。建议楼主看看session,application,request,page这几个常用的jsp作用域。jsp内置对象作用域 --------------------编程问答--------------------
引用 2 楼 magi1201 的回复:
session的作用范围是当前浏览器,所以两次请求时,如果数据放session,正好数据名称相同,则会受影响。建议楼主看看session,application,request,page这几个常用的jsp作用域。jsp内置对象作用域
但是我只是在需要查询个人订单的时候,才从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;
 }
}
--------------------编程问答--------------------
引用 1 楼 u012463264 的回复:
session  每个用户都可以用,如果两个用户都以同样的名字往session里存数据,会有影响的。
但是实际情况麻烦请看一下3楼,在第二次查询的时候,我查询的全部订单,并且没有给userID给值。 --------------------编程问答-------------------- 你确定查询全部订单时候,走的是else if 分支了 ?  struts2是单例模式应该不会有这个问题! --------------------编程问答-------------------- 你在查询全部的时候 输出一下osp.getUserID();如果没有值 ,说明你的this.paymentService.selectCompanyOrderList(osp);方法写的有问题 --------------------编程问答--------------------
引用 5 楼 u012463264 的回复:
你确定查询全部订单时候,走的是else if 分支了 ?  struts2是单例模式应该不会有这个问题!


struts2 不是单例模式 ,你用spring了吗  是不是在注入的时候设置成单例模式了 。 --------------------编程问答--------------------
引用 5 楼 u012463264 的回复:
你确定查询全部订单时候,走的是else if 分支了 ?  struts2是单例模式应该不会有这个问题!
嗯,查询的时候都走到了对应的if else分支。 我仔细看了下第一次查询个人订单的时候由于穿了一个userID,第二次再次查询全部订单的时候,进入action的时候userID就已经是上一次的值了 --------------------编程问答-------------------- if(systeHandleBaseService.hasPermission(CompanyPermissionEnums.SEARCH_ALL_ORDERS.getValue())) {
  LOG.debug("==========get all company orders============");
  List<OrderSearchResult> osrList =     this.paymentService.selectCompanyOrderList(osp);
 }
这个不是查询全部吗 你可以在里面加一行: osp.setUserID("");

你这是由于单例模式产生的问题 --------------------编程问答-------------------- 你用的是struts 1还是2? --------------------编程问答--------------------
引用 8 楼 chenxyz707 的回复:
Quote: 引用 5 楼 u012463264 的回复:

你确定查询全部订单时候,走的是else if 分支了 ?  struts2是单例模式应该不会有这个问题!
嗯,查询的时候都走到了对应的if else分支。 我仔细看了下第一次查询个人订单的时候由于穿了一个userID,第二次再次查询全部订单的时候,进入action的时候userID就已经是上一次的值了
那你肯定是把第一次查询的对象又返回到页面去了。 --------------------编程问答--------------------
引用 10 楼 u012463264 的回复:
你用的是struts 1还是2?

我用的struts2 我也怀疑是和单例模式有关系。
我修改了下注解

@Controller("companypaymentAction")
@Scope("prototype")

private OrderSearchParam osp;

@Resource(name="orderSearchParam")
public void setOsp(OrderSearchParam osp) {
this.osp = osp;
}


@Component("orderSearchParam")
public class OrderSearchParam{}


好像还是不对呀 --------------------编程问答-------------------- 接收页面请求参数用request --------------------编程问答--------------------
引用 9 楼 u012463264 的回复:
if(systeHandleBaseService.hasPermission(CompanyPermissionEnums.SEARCH_ALL_ORDERS.getValue())) {
  LOG.debug("==========get all company orders============");
  List<OrderSearchResult> osrList =     this.paymentService.selectCompanyOrderList(osp);
 }
这个不是查询全部吗 你可以在里面加一行: osp.setUserID("");

你这是由于单例模式产生的问题

我知道这样修改,发现问题后我也是这么改的。那么怎么让它变成非单例的? --------------------编程问答--------------------
引用 14 楼 chenxyz707 的回复:
Quote: 引用 9 楼 u012463264 的回复:

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

你这是由于单例模式产生的问题

我知道这样修改,发现问题后我也是这么改的。那么怎么让它变成非单例的?

struts2本身不是单例的 线程安全的 ,不该有这种情况的 。你是不是在哪里把它设置成单例的了 。
比如spring 注入时候设置成单例的了。 --------------------编程问答-------------------- 你是用Spring注入的,没有显示指定Scope的话,默认是singleton也就是单例的,两次请求用的是一个对象,参数肯定是相互影响的了,指定Scope为prototype就可以了。。。。 --------------------编程问答--------------------
引用 16 楼 shentianzhi2009 的回复:
你是用Spring注入的,没有显示指定Scope的话,默认是singleton也就是单例的,两次请求用的是一个对象,参数肯定是相互影响的了,指定Scope为prototype就可以了。。。。

使用

@Controller("companypaymentAction")
@Scope("prototype")

注解的action应该就是非单例的了吧? --------------------编程问答-------------------- 这样的很顶不行吧 --------------------编程问答-------------------- 是不是jsp上有userID文本框,第一次查询的时候赋值了,第二次查询的时候又传值回来了,所以没有set就有值了 --------------------编程问答-------------------- 代码格式太差 ··
不想看  
友情帮顶了 --------------------编程问答-------------------- 这个问题遇到过 就是单例 和多例的问题 ,struts默认是 单例,就像静态变量,你不关闭服务器 ,操作的就是同一个。
spring配置时 加上 prototype
<bean id="commentAction" class="com.ramada.comment.action.CommentAction" scope="prototype"> --------------------编程问答--------------------
引用 5 楼 u012463264 的回复:
你确定查询全部订单时候,走的是else if 分支了 ?  struts2是单例模式应该不会有这个问题!

Struts2的action貌似不是单例的吧,不同的请求过来action都是新建的。 --------------------编程问答-------------------- 请问你用的Struts是哪个版本 --------------------编程问答--------------------
引用 23 楼 jacal1 的回复:
请问你用的Struts是哪个版本

用的是struts2 --------------------编程问答--------------------
引用 23 楼 jacal1 的回复:
请问你用的Struts是哪个版本

struts 2.2.1
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,