我获得了一个用例,提出了一个解决方案,允许每个用户ID的配置数量的用户在任何给定时间登录到我的应用程序。 例如:userid'parentuser'可以在任何时候用于登录应用程序最多10次。在此限制之后,用户将不允许登录,因为最大用户数正在访问该用户的应用程序。 现在,为了实现这一点,我创建了一个上下文监听器,它将实例化一个属性,当用户在Action类中登录应用程序时,该属性将不断更新。 我的上下文监听器如下:
public class ApplicationContextListener实现ServletContextListener {
private Map<String, List<ApplicationContextBean>> userMap;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
userMap = null;
}
@Override
public void contextInitialized(ServletContextEvent event) {
userMap = new HashMap<String, List<ApplicationContextBean>>();
}
public Map<String, List<ApplicationContextBean>> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, List<ApplicationContextBean>> userMap) {
this.userMap = userMap;
}
}
web.xml在
下面<listener>
<listener-class>com.pcs.bpems.portal.listener.ApplicationContextListener</listener-class>
</listener>
问题:我现在如何从我的动作类中访问此上下文对象'userMap'?如果有人有任何其他方法也不同于此,请发布相同的。 感谢
答案 0 :(得分:2)
答案在你的问题的标题中:将Map(或包装地图并提供有用方法的对象)存储到servlet上下文的属性中(可从事件中访问),并从任何你想要的地方检索它: HttpServletRequest提供对servlet上下文的访问。
如果您的应用程序是群集的,那么更好的解决方案就是使用数据库。
此外,不要忘记在会话到期时减少计数器。
答案 1 :(得分:0)
这可以存储在Servlet上下文中,如下所示:
@Override
public void contextInitialized(ServletContextEvent event) {
userMap = new HashMap<String, Map<String,List<ApplicationContextBean>>>();
event.getServletContext().setAttribute(ApplicationConstants.LOGGED_IN_USERS, userMap);
}
然后可以从HttpSession对象中获取存储的参数,如下所示:
currentSession.getServletContext().getAttribute(LOGGED_IN_USERS)