我有一个页面,其中包含具有Alpha权限的帐户可以访问。 JSP会检查会话以查找名为"AlphaPerm"
的属性。
但我遇到的问题是,如果我发现用户正在搞乱/滥用alpha测试权限,我想立即阻止他。我可以立即更改我的数据库中的权限,但这并不能立即阻止滥用者。
一种可能的解决方案是每次我的用户执行某些操作时检查我的数据库,但我不想这样做,因为这会降低数据库的速度。
那么如何在运行中杀死他的会话(创建管理页面是我的计划,但我如何获取用户会话对象)?基本上我想创建一个管理页面,以便我可以禁止用户。
答案 0 :(得分:2)
您可以通过实施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();
答案 1 :(得分:0)
据我了解你的问题,检查DB
肯定是一件坏事。
此外,您必须将某些值与其他一些标准值进行比较,以确定用户是否正在搞乱。 因此,DB检查的替代方法是将这些值存储在用户会话中并检查这些值。
我建议使用ServletFilter
来完成这项工作,而不是创建一个管理页面(可能是一个JSP页面)。
我个人建议的一件事是,不是让整个会话无效,你应该在一段时间或下次登录时对用户施加一些限制(例如限制某些资源的访问)。