解决方案 »

  1.   

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

  2.   


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

  3.   


    但是你怎么知道这个用户的session对象呢?项目是这样做的,每次用户登录成功之后,都取session对象,把用户信息保存其中,如下:
    Map<String, Object> session = ActionContext.getContext().getSession();
    session.put(“username”, username);
    是啊,删除这个username的map值就可以了。或者你强制用户退出下
      

  4.   


    但是你怎么知道这个用户的session对象呢?项目是这样做的,每次用户登录成功之后,都取session对象,把用户信息保存其中,如下:
    Map<String, Object> session = ActionContext.getContext().getSession();
    session.put(“username”, username);
    是啊,删除这个username的map值就可以了。或者你强制用户退出下
    我在描述下场景。有后台管理和前台用户两套系统。每次用户登录都会存session,session.put(“username”, username);
    现在的问题   1)后台管理员可以获取前台的这个session么?
                            2)即便可以获得,那么简单的remove,是针对哪个用户?还是全部的用户session都没有了?
      

  5.   

    删除这个username的map值就可以了。或者你强制用户退出下
      

  6.   


    如果多个用户登录,你怎么确定哪个用户对应的map值啊
      

  7.   

    可以将key值设置成唯一的,在username后面拼接
      

  8.   

    这个你的定义以个服务器全局的变量,也就是每个用户都能存取的变量map,每个用户登录的时候都以自己的登录名为KEY,session为值放到这个map里,每次删除用户的时候,查找这个map,如果有以删除用户名的session,取出来销毁了,否则的话不行,因为每个用户的session是独立的,其他的用户是得不到的,所以是不能操作其他的用户的session的。
      

  9.   

    楼上说的好像是说所有的用户用的是一个session吗session是有id的 每个用户对应一个吧,  
    如果按楼上说的好像是用户A放到session中的东西,用户B也能取到?
      

  10.   

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

  11.   

    session有效期设置30分钟就好了,用户不操作30分钟以后session自动清空,用户信息自然也没了
      

  12.   


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

  13.   


    每次都在filter中做判断,会不会使网站的访问速度降低,因为按你所说,每一个请求都要判断相应的session,都要做一次数据库的查询、、、这样会不会影响到速度???
    session存到全局变量中了,每次删除的时候检查这个全局变量就行了。如果有该用户的session就销毁就行,
    你filter 还是正常拦截检查每个操作是否有session,不用查数据库,
      

  14.   


    什么叫服务器的全局变量?
    你定义一个类,类里边定义一个静态的变量,其他所有的类都能访问,这就是服务器全局变量。 
    跟平常Map<String, Object> session = ActionContext.getContext().getSession();这样有区别么?
      

  15.   

    你定义一个全局的 Map<String ,httpsession>( map=new hashMap<String ,httpsession>();之后每个用登录的时候就把他的session放到map里,以用户的登录名为KEY.
      

  16.   


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

  17.   


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

  18.   


    明白了,相当于把所有登录的session都放在一个全局变量里,相当于他在服务运行的时候,其登录信息全部保存在服务器的内存中。如果用户登录量大的话,应该对内存没有太大影响吧。
    我觉得这个session一直在内存中,知道超时和销毁时才不在内存中, 用全局的变量保存也只是指向了这个对象,便于取到每个用户的session。不会影响服务器的。session超时和销毁时,会指向null,你还的自己试试。我没做过web的这种操作,只做过socket的。
      

  19.   


    明白了,相当于把所有登录的session都放在一个全局变量里,相当于他在服务运行的时候,其登录信息全部保存在服务器的内存中。如果用户登录量大的话,应该对内存没有太大影响吧。
    我觉得这个session一直在内存中,知道超时和销毁时才不在内存中, 用全局的变量保存也只是指向了这个对象,便于取到每个用户的session。不会影响服务器的。session超时和销毁时,会指向null,你还的自己试试。我没做过web的这种操作,只做过socket的。非常感谢
      

  20.   


    跟不设置这个全局变量,只是每个用户的key值唯一,然后每次使用的时候直接取。
    Map<String, Object> session = ActionContext.getContext().getSession();
    session.get("usernameA");
    有什么区别呀???
    session本身是和map很类似,当一个用户登录时候调用
    Map<String, Object> session = ActionContext.getContext().getSession();这个时候取到的是你当前的用户对应的会话对象,而你是娶不到别的用户的会话对象的。  而我们现在要做的事取到别的用户的会话对象并销毁,所以要把每个用户对应的会话以用户的名字为KEY,session为值存到全局变量里。
      

  21.   

    session是每个用户对应一个的, 比如A用户 放到session里的东西,B用户是获取不到的 ,说明每个用户是对应自己的session的, 并不是所有用户共用一个session的。
      

  22.   


    如果这个用户做了某种投机取巧的方法,保证一直处于操作状态,那岂不是一直都相当于删除不了吗?
    完全没这个必要,你想想 你的用户我想是后台管理员客服吧?他要是投机取巧你直接冻结账号不可用不就好了?再说了 你还能检测到你的管理员客服有没有投机取巧恶意刷新恶意操作么?呵呵 这个不能吧?退一步讲你就算是能够检测得到  删除了他的session让他强制退出 那么他在刷新页面一直F5刷新登录 你是不是还得请个专门的客服来删除它的session呢?办法很简单 直接用权限大的管理员把他的账号冻结为不可用 登录都没法登录 或者直接删除账号就好了,更何况你的客服是你花钱请来的你觉得他会那么蠢敢这种吃力不讨好的事儿啊,账号是你公司超级管理员给的,别人也不知道啊,安全,管理员数量毕竟少数,公司在大也不会很多,你这个想法是多余的,如果是前台用户 游客这类型的类似于商城和微博啊这种用户的话 就跟没必要session删除了 你的portal可不就是让他们浏览和查看的么 前台用户是否恶意刷新和操作 你跟没法检测了 你说对么?
      

  23.   

    如果你只是想在删除账户的时候吧session也同时删除 那么也是可以的 每次登陆的session都放入一个Map<userId,session>之中,删除账户的时候用删除账户的ID将session从map中移除,同时在你的拦截器中拦截费登录请求的时候用当前登录用户的ID去这个Map中查找是否有session,如果存在就继续访问,如果不存在就直接将请求redirect道登录页面 ok,如果觉得会因为用户数量大而会增大内存开销这也是不可避免的,同样你也可以将session信息放入redis之中缓存起来也是一样的 总结如下
    1.在你的登录方法中将每次登录的session放入Map<userId,session>之中
    2.在你的拦截器preXX方法中拦截非登录的请求,首先用当前登录用户的ID去上述Map中取相关的session,如果存在则说明账户没有删除,可以继续访问,如果不存在相关session则说明账户已被删除,那么同时将当前登录用户的session销毁,同时将请求redirect道登录界面即可
      

  24.   


    每次都在filter中做判断,会不会使网站的访问速度降低,因为按你所说,每一个请求都要判断相应的session,都要做一次数据库的查询、、、这样会不会影响到速度???
    使用缓存呗。 要删除的用户在数据库中物理/逻辑删除完之后,存入缓存中,filter验证时读缓存,invalid之后要记得remove缓存
      

  25.   


    但是你怎么知道这个用户的session对象呢?项目是这样做的,每次用户登录成功之后,都取session对象,把用户信息保存其中,如下:
    Map<String, Object> session = ActionContext.getContext().getSession();
    session.put(“username”, username);
    从Map中获取对应用户的Session,然后执行Session.invalidate();让该用户Session失效就可以了.这样就清楚指定用户的登录信息.
    J2EE是不分Session是属于哪个用户的, 记住HTTP是无状态协议, 每次是根据浏览器Cookie定位缓存中的用户信息(Session).
      

  26.   


    如果这个用户做了某种投机取巧的方法,保证一直处于操作状态,那岂不是一直都相当于删除不了吗?
    完全没这个必要,你想想 你的用户我想是后台管理员客服吧?他要是投机取巧你直接冻结账号不可用不就好了?再说了 你还能检测到你的管理员客服有没有投机取巧恶意刷新恶意操作么?呵呵 这个不能吧?退一步讲你就算是能够检测得到  删除了他的session让他强制退出 那么他在刷新页面一直F5刷新登录 你是不是还得请个专门的客服来删除它的session呢?办法很简单 直接用权限大的管理员把他的账号冻结为不可用 登录都没法登录 或者直接删除账号就好了,更何况你的客服是你花钱请来的你觉得他会那么蠢敢这种吃力不讨好的事儿啊,账号是你公司超级管理员给的,别人也不知道啊,安全,管理员数量毕竟少数,公司在大也不会很多,你这个想法是多余的,如果是前台用户 游客这类型的类似于商城和微博啊这种用户的话 就跟没必要session删除了 你的portal可不就是让他们浏览和查看的么 前台用户是否恶意刷新和操作 你跟没法检测了 你说对么?
    谢谢你码了这么多字,其实我都不怎么明白你说的东西。。
      

  27.   


    每次都在filter中做判断,会不会使网站的访问速度降低,因为按你所说,每一个请求都要判断相应的session,都要做一次数据库的查询、、、这样会不会影响到速度???
    使用缓存呗。 要删除的用户在数据库中物理/逻辑删除完之后,存入缓存中,filter验证时读缓存,invalid之后要记得remove缓存
    怎么使用缓存???真是第一次听说,望指教。
      

  28.   

    你的困惑主要在于无法随心所欲的控制某个用户的session,所以我不多说什么,你的重点要放在思考session和数据库联系起来。相信我,当你的session与数据库有了联系后,很多问题都会结局,我这里不说具体实现是因为我讲不完里面的太多,所以还得靠你自己去慢慢耐心的学习。另外不知道你清不清楚HttpSessionBindingListener的用法 这个类对我前面说的思路有很大的启发
      

  29.   


    但是你怎么知道这个用户的session对象呢?项目是这样做的,每次用户登录成功之后,都取session对象,把用户信息保存其中,如下:
    Map<String, Object> session = ActionContext.getContext().getSession();
    session.put(“username”, username);
    从Map中获取对应用户的Session,然后执行Session.invalidate();让该用户Session失效就可以了.这样就清楚指定用户的登录信息.
    J2EE是不分Session是属于哪个用户的, 记住HTTP是无状态协议, 每次是根据浏览器Cookie定位缓存中的用户信息(Session).HTTP是无状态协议,然后呢?我真的体会不到你的想法。
      

  30.   


    但是你怎么知道这个用户的session对象呢?项目是这样做的,每次用户登录成功之后,都取session对象,把用户信息保存其中,如下:
    Map<String, Object> session = ActionContext.getContext().getSession();
    session.put(“username”, username);
    从Map中获取对应用户的Session,然后执行Session.invalidate();让该用户Session失效就可以了.这样就清楚指定用户的登录信息.
    J2EE是不分Session是属于哪个用户的, 记住HTTP是无状态协议, 每次是根据浏览器Cookie定位缓存中的用户信息(Session).HTTP是无状态协议,然后呢?我真的体会不到你的想法。
    无状态也就是说每次请求和用户是谁都没有关联.所以不用担心当前用户能不能读取其他用户数据的问题.