1

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

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

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

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

4

2 回答 2

3

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

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

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();
于 2013-08-07T17:46:55.663 回答
0

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

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

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

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

于 2013-08-07T17:41:27.753 回答