【问题标题】:How do I remotely invalidate user's servlet session on-the-fly?如何即时远程使用户的 servlet 会话无效?
【发布时间】:2013-08-09 04:48:19
【问题描述】:

我有一个具有 alpha 权限的帐户可以访问的页面。 JSP 检查会话中名为 "AlphaPerm" 的属性。

但我正在努力解决的问题是,如果我发现用户正在弄乱/滥用 alpha 测试权限,我想立即阻止他。我可以立即更改他在我的数据库中的权限,但这并不能立即阻止施虐者。

一个可能的解决方案是每次我的用户做某事时检查我的数据库,但我不想这样做,因为这会减慢数据库的速度。

那么我如何即时终止他的会话(创建管理页面是我的计划,但我如何获取用户会话对象)?基本上我想创建一个管理页面,这样我就可以禁止一个用户。

【问题讨论】:

  • 您如何检查用户是否为messing 并具有alpha 权限?
  • @DigvijayYadav 以防万一我的 alpha 测试人员发疯......
  • 等等,你可能错过了理解我的问题。我想使他的会话无效。这就是我想要做的,也许是通过一个管理页面。
  • @DigvijayYadav 对不起,我想念你的问题。

标签: java javascript jsp tomcat servlets


【解决方案1】:

您可以通过实现HttpSessionListener 来保留对用户会话的引用。 This example 展示了如何实现会话计数器,但您也可以通过将单个会话存储在上下文范围的集合中来保留对各个会话的引用。然后,您可以从管理页面访问会话,检查它们的属性并使其中一些无效。 This post 也可能有有用的信息。

编辑:这是一个示例实现(未经测试):

public class MySessionListener implements HttpSessionListener {

    static public Map<String, HttpSession> getSessionMap(ServletContext appContext) {
        Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) appContext.getAttribute("globalSessionMap");
        if (sessionMap == null) {
            sessionMap = new ConcurrentHashMap<String, HttpSession>();
            appContext.setAttribute("globalSessionMap", sessionMap);
        }
        return sessionMap;
    }

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        Map<String, HttpSession> sessionMap = getSessionMap(event.getSession().getServletContext());
        sessionMap.put(event.getSession().getId(), event.getSession());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        Map<String, HttpSession> sessionMap = getSessionMap(event.getSession().getServletContext());
        sessionMap.remove(event.getSession().getId());
    }
}

然后您可以从任何 servlet 访问会话映射:

Collection<HttpSession> sessions = MySessionListener.getSessionMap(getServletContext()).values();

【讨论】:

  • 这很有趣,而且似乎是在正确的方向,但我有点笨,我不太明白他们是怎么做的。我希望有这样的东西:tomcatServletStuff.getSessionByID(somGuyzID),这个方法将返回一个 Session 对象
  • 编辑了我的答案以包含示例实现。
  • 知道为什么我想象的方法不存在吗?
  • 曾经有一个方法HttpSessionContext.getSession("id"),但现在已弃用。我的理解是,出于安全原因,他们不想让访问其他用户的会话变得太容易。
【解决方案2】:

据我了解,您对DB 的问题检查绝对是一件坏事。

您还必须将某些值与其他一些标准值进行比较,以确定用户是否在胡闹。 因此,作为数据库检查的替代方法,您可以将这些值存储在用户会话中并检查这些值。

我建议不要创建管理页面(可能是 JSP 页面),而是使用 ServletFilter 来完成这项工作。

另外,我个人建议的一件事是,与其使整个会话无效,不如在一段时间内或直到下次登录之前对用户施加一些限制(例如限制对某些资源的访问)。

【讨论】:

  • 因此,例如使用过滤器,您可以检查用户是否受到限制。如果是,那么您可以将他/她的请求(对于他正在弄乱的页面)转发到某个错误页面,告诉他他/她做错了什么以及他被限制的原因。
  • 过滤器是否需要检查我的数据库?我不确定过滤器是如何工作的
  • 如果您在会话中拥有所有内容,那么您将不需要数据库检查。
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 2014-02-25
  • 2012-01-24
  • 2013-01-04
  • 2017-07-29
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多