锁定老帖子 主题:关于webwork中的单用户登录的想法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-27
刚刚我在对webwork操作时 利用了session的.hashcode()方法得到了区别同一用户前后登录的编号,并且在后续操作过程中 有两个hashcode()总是会保持不变,似乎可以利用这个来处理 可存在一个问题 就是用户登录时我获取的hashcode与用户在请求其他action的hashcode竟然不同,而其他任何一个action由session获得的hashcode都相同,
|
|
返回顶楼 | |
发表时间:2007-05-27
kyvin 写道 刚刚我在对webwork操作时 利用了session的.hashcode()方法得到了区别同一用户前后登录的编号,并且在后续操作过程中 有两个hashcode()总是会保持不变,似乎可以利用这个来处理 可存在一个问题 就是用户登录时我获取的hashcode与用户在请求其他action的hashcode竟然不同,而其他任何一个action由session获得的hashcode都相同, 差点就成了罪人误导人了 上面的hashcode 如果单纯在各个action之间流走不会变化,可是当出现有验证码的页面,它会因为验证码的session变化而使得这个hashcode变化 按照icefire的算法,我现在是直接在登录时直接创建一个HttpSession 这样通过这个HttpSession获取ID,这样好象可以保证SessionID不发生变化,达到所需效果
|
|
返回顶楼 | |
发表时间:2007-05-27
下面是我利用算法做的一个拦截器,主要就是为了解决上述问题,可存在一个问题是:
每次用户登录虽然通过HttpSession获取的sessionId是不同的,这个时候要想实现单用户登录,也可以自己设计一个方法来做,但是我选择了拦截器,下面是我的拦截器代码 public String intercept(ActionInvocation invocation) throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); String hashcode=session.getId(); Customer customer =(Customer) invocation.getInvocationContext().getSession().get("customer"); if(customer!=null){ if(hashcode!=null){ String hashcodetemp=customer.getPointcode(); if(hashcodetemp.equals(hashcode)){ ThreadLocalUser.set(customer); String result = invocation.invoke(); ThreadLocalUser.set(null); loggedIn = true; return result; } ActionContext.getContext().getSession().clear(); HttpServletRequest req = ServletActionContext.getRequest(); HttpSession sessionnull = req.getSession(); sessionnull.invalidate(); ActionSupport action = (ActionSupport) invocation.getAction(); action.addActionError("^o^你的账号已经在其它地方登录^o^"); loggedIn = false; return Action.LOGIN; } ActionSupport action = (ActionSupport) invocation.getAction(); action.addActionError("^o^你的账号已经在其它地方登录^o^"); loggedIn = false; return Action.LOGIN; } loggedIn = false; return Action.LOGIN; } 在调试的过程发现,每次获取的Customer对象中的postcode竟然是没有刷新的,而是从session获取的,虽然我已经在第二个用户强制登录后update了 postcode这个列,我也想了其它方法来check或者fetch这个customer对象,但是都是出现null指针问题,暂时想不出法子,有能帮忙解决的吗 谢谢了 |
|
返回顶楼 | |
发表时间:2007-05-31
拦截器为aop思想 是不是与webwork这种传统的横向处理没有交叉点 就是无法在其中调用组件或者接口 来查询数据库获取数据 或者说获取最新的对象
|
|
返回顶楼 | |
发表时间:2007-08-03
itea 写道 icefire的方法我想到过,
但是这个方法有个问题, 如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。 可能,在可以接受的范围内。 to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。 你可以做一个HttpSessionListener,当用户session超时失效时。调用public void sessionDestroyed方法,从map中remove掉失效session. |
|
返回顶楼 | |
发表时间:2007-11-12
继续关注,有时浏览器也会影响SESSION
|
|
返回顶楼 | |
发表时间:2007-11-12
HttpSession hs=ServletActionContext.getRequest().getSession(); String sid=""; if(hs!=null) sid=hs.getId(); 我是在Interceptor中用这个方法获得sessionId的 |
|
返回顶楼 | |