日期:2014-05-17  浏览次数:20749 次

struts2 action中部分语句被直接跳过不执行.. 请问这会是什么原因.
本帖最后由 lq38366 于 2012-11-26 17:40:02 编辑 在开发OA系统时,我们项目中 员工表包含了部门信息... 登录后把这些信息都放入session中。

用于权限的判断和工作流的审批...请问如何在修改完员工部门信息后不重新登录。

如何即时更新session 中存放的信息。

目前考虑的解决办法是用HttpSessionListener , 监听 session 的创建和销毁..

当有员工的部门信息被改变之后强制销毁当前的session .必须重新登录。 

但是在action 中的

ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);

代码直接被跳过了...无法监听到session的改变 。 


------最佳解决方案--------------------
session.setAttribute(name,value);
如果两次设置的name相同,只在第一次set时触发session的attributeAdded事件,
所以你的代码好像只执行了一次一样。
解决方案是设定时间标志:
Date dateFlag=new Date();
session.setAttribute("dateFlag",dateFlag);
session.setAttribute(name+dateflag,value);//这样能保证你每次设置属性都能触发事件

在attributeAdded方法中用以下语句获取value:
Date dateFlag=session.getAttribute("dateFlag");
SomeObject obj=session.getAttribute(name+dateFlag);

OKAY.
------其他解决方案--------------------
引用:
现在的问题就是当更新完部门信息之后,操作session 这代码只执行一遍, 修改完一个后,

后面继续修改部门 。

ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);

上面这句话就不执行了, 也就无法让HttpSessionListener 监听了,


我估计是执行的吧,只是监听没起作用。

第二次修改后,执行语句,updateDep属性值仍是employee,什么都没有改变的话,会引起监听反应吗?
------其他解决方案--------------------
ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);

你这个只能修改当前用户的session,有什么用?
你是想修改别的用户吧,你要取得那个用户所对应的session。

因此,你需要一个Map<User,Session> 用于获取相应用户的session
------其他解决方案--------------------
代码直接被跳过了?

什么叫代码被跳过了?怎么会无故跳过代码呢?重新编译,重启服务再试。看是不是开了多个相同的项目引起的。
代码被跳过了,本身就不应该出现,这不是如果实现的问题。
------其他解决方案--------------------
难道不可以在修改部门信息时就修改session吗?
------其他解决方案--------------------
引用:
ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);

你这个只能修改当前用户的session,有什么用?
你是想修改别的用户吧,你要取得那个用户所对应的session。

因此,你需要一个Map<User,Session> 用于获取相应用户的session


 恩, 你说的没错。 我们现在的思路也是这样.

ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);

当这句话执行完之后,就应该进入监听器中的 attributeAdded 方法。我们有个sessionMaps 存放的就是

所有用户的session信息。然后根据已经更新过部门信息的员工名称将 sessionMaps存放的session信息给

invalidate, 因为更新了部门信息所以强制用户重新登录。

现在的问题就是当更新完部门信息之后,操作session 这代码只执行一遍, 修改完一个后,

后面继续修改部门 。

ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);

上面这句话就不执行了, 也就无法让HttpSessionListener 监听了,


------其他解决方案--------------------
引用:
代码直接被跳过了?

什么叫代码被跳过了?怎么会无故跳过代码呢?重新编译,重启服务再试。看是不是开了多个相同的项目引起的。
代码被跳过了,本身就不应该出现,这不是如果实现的问题。


     经过打印调试信息和跟踪,确实没被跳过..是执行了 。 只是监听没起作用..

 下面好像已经有回复提到 , 谢谢您的回答。
------其他解决方案--------------------
引用:
引用:
现在的问题就是当更新完部门信息之后,操作session 这代码只执行一遍, 修改完一个后,