为什么两次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("");解决了。但是还存在诸多疑问,实在是不明白为什么两次请求的参数为什么会产生影响,求大神解答。
附上其他。
--------------------编程问答-------------------- session 每个用户都可以用,如果两个用户都以同样的名字往session里存数据,会有影响的。 --------------------编程问答-------------------- session的作用范围是当前浏览器,所以两次请求时,如果数据放session,正好数据名称相同,则会受影响。建议楼主看看session,application,request,page这几个常用的jsp作用域。jsp内置对象作用域 --------------------编程问答-------------------- 但是我只是在需要查询个人订单的时候,才从session里面拿出来set进userID查询条件呀。也就是说我查询全部订单的时候并没有把userID放进osp里面但是我在第二次进入action的时候osp.userID就已经有值了。另外更正一下第11行if前面换行。
$.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
}});
@Controller("companypaymentAction")--------------------编程问答-------------------- 但是实际情况麻烦请看一下3楼,在第二次查询的时候,我查询的全部订单,并且没有给userID给值。 --------------------编程问答-------------------- 你确定查询全部订单时候,走的是else if 分支了 ? struts2是单例模式应该不会有这个问题! --------------------编程问答-------------------- 你在查询全部的时候 输出一下osp.getUserID();如果没有值 ,说明你的this.paymentService.selectCompanyOrderList(osp);方法写的有问题 --------------------编程问答--------------------
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;
}
}
struts2 不是单例模式 ,你用spring了吗 是不是在注入的时候设置成单例模式了 。 --------------------编程问答-------------------- 嗯,查询的时候都走到了对应的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? --------------------编程问答-------------------- 那你肯定是把第一次查询的对象又返回到页面去了。 --------------------编程问答--------------------
你用的是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 --------------------编程问答--------------------
if(systeHandleBaseService.hasPermission(CompanyPermissionEnums.SEARCH_ALL_ORDERS.getValue())) {
LOG.debug("==========get all company orders============");
List<OrderSearchResult> osrList = this.paymentService.selectCompanyOrderList(osp);
}
这个不是查询全部吗 你可以在里面加一行: osp.setUserID("");
你这是由于单例模式产生的问题
我知道这样修改,发现问题后我也是这么改的。那么怎么让它变成非单例的? --------------------编程问答--------------------
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就可以了。。。。 --------------------编程问答--------------------
你是用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"> --------------------编程问答--------------------
你确定查询全部订单时候,走的是else if 分支了 ? struts2是单例模式应该不会有这个问题!
Struts2的action貌似不是单例的吧,不同的请求过来action都是新建的。 --------------------编程问答-------------------- 请问你用的Struts是哪个版本 --------------------编程问答--------------------
请问你用的Struts是哪个版本
用的是struts2 --------------------编程问答--------------------
请问你用的Struts是哪个版本
struts 2.2.1
补充:Java , Java EE