前提:只单纯从算法或逻辑上去处理,只是小型系统而已,并不想采用什么中间件
环境如下:
1.当用户登录后,我们可以通过程序纪录下用户的IP来控制,当另外一个用户再次利用该账号登陆时,我们可以或许该用户的IP地址,纪录到数据库中,当用户调用相应的action时,我们可以设置一个拦截器直接来拦截,进行比对,当不满足的直接回到原始页面。
存在问题:当用户是用代理上网,似乎这样就行不通了。
2.我们可以在数据库中设置一个字段来纪录,当用户登录后update这个字段,这样再次利用这个用户登录系统时,会被系统拒绝掉。
存在问题:对用户不友好,但用户账号泄密时,似乎这样做不到强制登录,来剔除正在登录用户,虽然我做过一个强制登录,可能技术有限,暂时想不到啥好算法来实现,特别是利用webwork的session来控制更让我头大,cookies没考虑。
不知道有这方面经验的朋友有没有好的算法或者想法,一起来分享下
1 楼
itea
2007-05-25
我们公司也在做类似的实现
比你的稍微复杂一点,
我们是一个统一用户管理系统管理其他子系统的用户账号和权限,
在子系统登陆时到用户管理系统去验证。
我也用了类似一个字段这样的方式。
不过我不知道楼主要做的是想要到达一个什么样的效果?
比你的稍微复杂一点,
我们是一个统一用户管理系统管理其他子系统的用户账号和权限,
在子系统登陆时到用户管理系统去验证。
我也用了类似一个字段这样的方式。
不过我不知道楼主要做的是想要到达一个什么样的效果?
2 楼
kyvin
2007-05-25
我的效果就是能否把我那两个存在的问题解决最好 否则也只能退而求其次来利用字段直接封掉
3 楼
qqbuilder
2007-05-25
kyvin 写道
我的效果就是能否把我那两个存在的问题解决最好 否则也只能退而求其次来利用字段直接封掉
记录sessionID即可
4 楼
kyvin
2007-05-26
这个想法我早有了 可是webwork的session的ID能获取到~?或许在我学习中有漏过 能否详细下说明 谢谢
5 楼
itea
2007-05-26
可以这样做,
A用户第一次登陆用sessionA,
然后第二次登陆的时候用了sessionB,这个时候,就要使sessionA失效,
这样,就能起到一个用户只能在一台机器上登陆的效果,
当然,用户的每一次操作需要服务端检查它的session。
目前问题是如何在其他回话取到sessionA,并使它失效,我也在寻找这样的方法。貌似servletAPI没有提供。
A用户第一次登陆用sessionA,
然后第二次登陆的时候用了sessionB,这个时候,就要使sessionA失效,
这样,就能起到一个用户只能在一台机器上登陆的效果,
当然,用户的每一次操作需要服务端检查它的session。
目前问题是如何在其他回话取到sessionA,并使它失效,我也在寻找这样的方法。貌似servletAPI没有提供。
6 楼
icefire
2007-05-26
自己把sessionID取出来,和用户ID绑定,比如放到一个Map中,用户ID做Key。等到第二次登录的时候就查有没有这个Key,有就强制前一个session失效。
7 楼
kyvin
2007-05-26
icefire 写道
自己把sessionID取出来,和用户ID绑定,比如放到一个Map中,用户ID做Key。等到第二次登录的时候就查有没有这个Key,有就强制前一个session失效。
楼上的所说 我在做jsp的时候会利用这种思路来解决,每次登录自动生成一个码来区分,但是现在在处理webwork时,session内型为map,而且似乎webwork中的session与对象绑定,并且似乎没有更好的法子获取到sessionID 难道把这个session 转化为 httpsession?~
现在的处理方式 用户登录直接 session.put("user",user)
8 楼
itea
2007-05-27
icefire的方法我想到过,
但是这个方法有个问题,
如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。
可能,在可以接受的范围内。
to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。
但是这个方法有个问题,
如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。
可能,在可以接受的范围内。
to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。
9 楼
kyvin
2007-05-27
itea 写道
icefire的方法我想到过,
但是这个方法有个问题,
如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。
可能,在可以接受的范围内。
to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。
呵呵 我可没说不能取噢 我只是说难道要把session转化为HttpSession类型来获取,我只是发现好象webwork中得到的session并不获取sessionID的方法而已 呵呵 不能我们就可以利用icefire的方法,用拦截器来判断sessionID来解决问题了但是这个方法有个问题,
如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。
可能,在可以接受的范围内。
to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。
10 楼
kyvin
2007-05-27
刚刚我在对webwork操作时 利用了session的.hashcode()方法得到了区别同一用户前后登录的编号,并且在后续操作过程中 有两个hashcode()总是会保持不变,似乎可以利用这个来处理 可存在一个问题 就是用户登录时我获取的hashcode与用户在请求其他action的hashcode竟然不同,而其他任何一个action由session获得的hashcode都相同,
11 楼
kyvin
2007-05-27
kyvin 写道
刚刚我在对webwork操作时 利用了session的.hashcode()方法得到了区别同一用户前后登录的编号,并且在后续操作过程中 有两个hashcode()总是会保持不变,似乎可以利用这个来处理 可存在一个问题 就是用户登录时我获取的hashcode与用户在请求其他action的hashcode竟然不同,而其他任何一个action由session获得的hashcode都相同,
差点就成了罪人误导人了 上面的hashcode 如果单纯在各个action之间流走不会变化,可是当出现有验证码的页面,它会因为验证码的session变化而使得这个hashcode变化 按照icefire的算法,我现在是直接在登录时直接创建一个HttpSession 这样通过这个HttpSession获取ID,这样好象可以保证SessionID不发生变化,达到所需效果
12 楼
kyvin
2007-05-27
下面是我利用算法做的一个拦截器,主要就是为了解决上述问题,可存在一个问题是:
每次用户登录虽然通过HttpSession获取的sessionId是不同的,这个时候要想实现单用户登录,也可以自己设计一个方法来做,但是我选择了拦截器,下面是我的拦截器代码
在调试的过程发现,每次获取的Customer对象中的postcode竟然是没有刷新的,而是从session获取的,虽然我已经在第二个用户强制登录后update了 postcode这个列,我也想了其它方法来check或者fetch这个customer对象,但是都是出现null指针问题,暂时想不出法子,有能帮忙解决的吗 谢谢了
每次用户登录虽然通过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指针问题,暂时想不出法子,有能帮忙解决的吗 谢谢了
13 楼
kyvin
2007-05-31
拦截器为aop思想 是不是与webwork这种传统的横向处理没有交叉点 就是无法在其中调用组件或者接口 来查询数据库获取数据 或者说获取最新的对象
14 楼
andyao
2007-08-03
itea 写道
icefire的方法我想到过,
但是这个方法有个问题,
如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。
可能,在可以接受的范围内。
to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。
但是这个方法有个问题,
如果用户的session是因为超时而自动失效的话,它还是会留在那个map中,这样用户一多的话就吃内存。
可能,在可以接受的范围内。
to kyvin, webWork没有取到request的方法么?有的话可以从request上取session. HttpSession有getSession()方法。
你可以做一个HttpSessionListener,当用户session超时失效时。调用public void sessionDestroyed方法,从map中remove掉失效session.
15 楼
pythonjyc
2007-11-12
继续关注,有时浏览器也会影响SESSION
16 楼
WinLive
2007-11-12
HttpSession hs=ServletActionContext.getRequest().getSession(); String sid=""; if(hs!=null) sid=hs.getId();
我是在Interceptor中用这个方法获得sessionId的