本帖最后由 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.
------其他解决方案--------------------------------------------------------
我估计是执行的吧,只是监听没起作用。
第二次修改后,执行语句,updateDep属性值仍是employee,什么都没有改变的话,会引起监听反应吗?
------其他解决方案--------------------------------------------------------
ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);
你这个只能修改当前用户的session,有什么用?
你是想修改别的用户吧,你要取得那个用户所对应的session。
因此,你需要一个Map<User,Session> 用于获取相应用户的session
------其他解决方案--------------------------------------------------------
代码直接被跳过了?
什么叫代码被跳过了?怎么会无故跳过代码呢?重新编译,重启服务再试。看是不是开了多个相同的项目引起的。
代码被跳过了,本身就不应该出现,这不是如果实现的问题。
------其他解决方案--------------------------------------------------------
难道不可以在修改部门信息时就修改session吗?
------其他解决方案--------------------------------------------------------
恩, 你说的没错。 我们现在的思路也是这样.
ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);
当这句话执行完之后,就应该进入监听器中的 attributeAdded 方法。我们有个sessionMaps 存放的就是
所有用户的session信息。然后根据已经更新过部门信息的员工名称将 sessionMaps存放的session信息给
invalidate, 因为更新了部门信息所以强制用户重新登录。
现在的问题就是当更新完部门信息之后,操作session 这代码只执行一遍, 修改完一个后,
后面继续修改部门 。
ServletActionContext.getRequest().getSession().setAttribute("updateDep",employee);
上面这句话就不执行了, 也就无法让HttpSessionListener 监听了,
------其他解决方案--------------------------------------------------------
经过打印调试信息和跟踪,确实没被跳过..是执行了 。 只是监听没起作用..
下面好像已经有回复提到 , 谢谢您的回答。
------其他解决方案--------------------------------------------------------