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

服务器主动删除session问题
在最近的项目中,遇到一个问题。在每次用户登录的时候,都把用户的信息保存在session值中。所以现在有个问题,如果在后台管理端把该用户删除,但是由于此用户的信息保存在session中,如果此用户一直没有重新登录,则没有达到删除的效果,即用户仍然可以登录操作。现在想,能否在服务器端主动删除此session???达到彻底删除用户的效果。。。。。
------解决方案--------------------
后台删除之后,从session中remove掉这个用户信息啊
------解决方案--------------------
引用:
Quote: 引用:

后台删除之后,从session中remove掉这个用户信息啊


但是你怎么知道这个用户的session对象呢?

项目是这样做的,每次用户登录成功之后,都取session对象,把用户信息保存其中,如下:
Map<String, Object> session = ActionContext.getContext().getSession();
session.put(“username”, username);

是啊,删除这个username的map值就可以了。或者你强制用户退出下
------解决方案--------------------
可以将key值设置成唯一的,在username后面拼接
------解决方案--------------------
这个你的定义以个服务器全局的变量,也就是每个用户都能存取的变量map,每个用户登录的时候都以自己的登录名为KEY,session为值放到这个map里,每次删除用户的时候,查找这个map,如果有以删除用户名的session,取出来销毁了,

否则的话不行,因为每个用户的session是独立的,其他的用户是得不到的,所以是不能操作其他的用户的session的。
------解决方案--------------------
lz的意思是这个人当前已经登录的时候,后台突然把他删除了,需要让他不能继续操作了么?
如果这样需要对每次请求的session做验证,可以在filter中,验证当前session中的user是否被删除,被删除的就session.invalidate(),然后重定向到登录页面让他去登录,重新登录的时候就会发现被删除了
------解决方案--------------------
session有效期设置30分钟就好了,用户不操作30分钟以后session自动清空,用户信息自然也没了
------解决方案--------------------
引用:
Quote: 引用:

这个你的定义以个服务器全局的变量,也就是每个用户都能存取的变量map,每个用户登录的时候都以自己的登录名为KEY,session为值放到这个map里,每次删除用户的时候,查找这个map,如果有以删除用户名的session,取出来销毁了,

否则的话不行,因为每个用户的session是独立的,其他的用户是得不到的,所以是不能操作其他的用户的session的。


什么叫服务器的全局变量?

你定义一个类,类里边定义一个静态的变量,其他所有的类都能访问,这就是服务器全局变量。 
------解决方案--------------------
引用:
Quote: 引用:

lz的意思是这个人当前已经登录的时候,后台突然把他删除了,需要让他不能继续操作了么?
如果这样需要对每次请求的session做验证,可以在filter中,验证当前session中的user是否被删除,被删除的就session.invalidate(),然后重定向到登录页面让他去登录,重新登录的时候就会发现被删除了


每次都在filter中做判断,会不会使网站的访问速度降低,因为按你所说,每一个请求都要判断相应的session,都要做一次数据库的查询、、、这样会不会影响到速度???

session存到全局变量中了,每次删除的时候检查这个全局变量就行了。如果有该用户的session就销毁就行,
你filter 还是正常拦截检查每个操作是否有session,不用查数据库,
------解决方案--------------------
你定义一个全局的 Map<String ,httpsession>( map=new hashMap<String ,httpsession>();

之后每个用登录的时候就把他的session放到map里,以用户的登录名为KEY.
------解决方案--------------------
几千个用户应该没问题
------解决方案--------------------
引用:
Quote: 引用:

你定义一个全局的 Map<String ,httpsession>( map=new hashMap<String ,httpsession>();

之后每个用登录的时候就把他的session放到map里,以用户的登录名为KEY.


明白了,相当于把所有登录的session都放在一个全局变量里,相当于他在服务运行的时候,其登录信息全部保存在服务器的内存中。如果用户登录量大的话,应该对内存没有太大影响吧。。。。

我觉得这个session一直在内存中,知道超时和销毁时才不在内存中, 用全局的变量保存也只是指向了这个对象,便于取到每个用户的session。不会影响服务器的。session超时和销毁时,会指向null,你还的自己试试。我没做过web的这种操作,只做过socket的。
------解决方案--------------------
引用:
Quote: 引用:

几千个用户应该没问题


跟不设置这个全局变量,只是每个用户的key值唯一,然后每次使用的时候直接取。
Map<String, Object> session = ActionContext.getContext().getSession();
session.get("usernameA")