Java 如何远程使用户失效';正在运行的servlet会话是什么?

Java 如何远程使用户失效';正在运行的servlet会话是什么?,java,javascript,jsp,tomcat,servlets,Java,Javascript,Jsp,Tomcat,Servlets,我有一个页面,具有alpha权限的帐户可以访问该页面。JSP检查会话中名为“AlphaPerm”的属性 但我正在努力解决的问题是,如果我发现一个用户正在扰乱/滥用alpha测试权限,我想立即阻止他。我可以立即更改他在我数据库中的权限,但这并不能立即阻止施虐者 一个可能的解决方案是每次我的用户做某事时检查我的数据库,但我不想这样做,因为那样会减慢数据库的速度 那么,我如何在运行中终止他的会话(创建一个管理页面是我的计划,但如何获得用户会话对象)?基本上,我想创建一个管理页面,这样我就可以禁止一个用

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

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

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


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

据我所知,根据
DB
检查您的问题肯定是件坏事

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

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


还有一件事我个人建议,与其使整个会话无效,不如在一段时间内或下次登录前对用户设置一些限制(例如限制对某些资源的访问)。

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

编辑:下面是一个示例实现(未测试):

公共类MySessionListener实现HttpSessionListener{
静态公共映射getSessionMap(ServletContext appContext){
MapSessionMap=(Map)appContext.getAttribute(“globalSessionMap”);
if(sessionMap==null){
sessionMap=新的ConcurrentHashMap();
setAttribute(“globalSessionMap”,sessionMap);
}
返回sessionMap;
}
@凌驾
已创建公共无效会话(HttpSessionEvent事件){
Map sessionMap=getSessionMap(event.getSession().getServletContext());
sessionMap.put(event.getSession().getId(),event.getSession());
}
@凌驾
public void sessionDestroyed(HttpSessionEvent事件){
Map sessionMap=getSessionMap(event.getSession().getServletContext());
remove(event.getSession().getId());
}
}
然后,您可以从任何servlet访问会话映射:

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

你如何检查用户是否在
干扰alpha任务?@DigvijayYadav,以防我的alpha测试人员发疯……等等,你可能没有理解我的问题。我想使他的治疗无效。这就是我想要做的,也许是通过一个管理页面。@DigvijayYadav对不起,我没能理解你的问题。例如,使用一个过滤器,你可以检查用户是否受到限制。如果是,那么您可以将他/她的请求(针对他正在处理的页面)转发到某个错误页面,告诉他/她做错了什么,以及他为什么受到限制。筛选器是否需要检查我的数据库?我不确定过滤器是如何工作的如果你在会话中有所有的东西,那么你就不需要DB检查了。这很有趣,而且似乎是以正确的方式进行的,但是我有点笨,我不太明白他们是如何做的。我希望有这样的东西:tomcatServletStuff.getSessionByID(somgyzid),这个方法将返回一个会话对象编辑我的答案以包含一个示例实现。知道我想象的方法为什么不存在吗?以前有一个方法
HttpSessionContext.getSession(“id”)
,但现在它已被弃用。我的理解是,出于安全原因,他们不想让访问其他用户的会话变得太容易。
Collection<HttpSession> sessions = MySessionListener.getSessionMap(getServletContext()).values();