Session 在Struts 1.2中访问Action类中的ServletContext对象

Session 在Struts 1.2中访问Action类中的ServletContext对象,session,servlets,struts-1,Session,Servlets,Struts 1,我已经得到了一个用例,以想出一个解决方案,允许在任何给定的时间,每个用户id登录到我的应用程序中的配置用户数。 例如:用户ID“parentuser”可用于在任何时候最多登录应用程序10次。超过此限制后,将不允许该用户登录,因为该用户访问应用程序的最大用户数。 现在,为了实现这一点,我创建了一个上下文侦听器,它将实例化一个属性,当用户在Action类中登录应用程序时,我将不断更新该属性。 我的上下文侦听器如下所示: @Override public void contextInitialized

我已经得到了一个用例,以想出一个解决方案,允许在任何给定的时间,每个用户id登录到我的应用程序中的配置用户数。 例如:用户ID“parentuser”可用于在任何时候最多登录应用程序10次。超过此限制后,将不允许该用户登录,因为该用户访问应用程序的最大用户数。 现在,为了实现这一点,我创建了一个上下文侦听器,它将实例化一个属性,当用户在Action类中登录应用程序时,我将不断更新该属性。 我的上下文侦听器如下所示:

@Override
public void contextInitialized(ServletContextEvent event) {
    userMap = new HashMap<String, Map<String,List<ApplicationContextBean>>>();
    event.getServletContext().setAttribute(ApplicationConstants.LOGGED_IN_USERS, userMap);
}
currentSession.getServletContext().getAttribute(LOGGED_IN_USERS)
公共类ApplicationContextListener实现ServletContextListener{

private-Map-userMap;
@凌驾
公共无效上下文已销毁(ServletContextEvent arg0){
userMap=null;
}
@凌驾
公共void contextInitialized(ServletContextEvent事件){
userMap=newhashmap();
}
公共映射getUserMap(){
返回userMap;
}
public void setUserMap(Map userMap){
this.userMap=userMap;
}
}

xml如下所示

<listener>
    <listener-class>com.pcs.bpems.portal.listener.ApplicationContextListener</listener-class>
</listener>

com.pcs.bpems.portal.listener.ApplicationContextListener
问题:现在如何从action类访问这个上下文对象“userMap”?如果任何人有任何其他不同的方法,也请张贴相同的。
谢谢

答案在您问题的标题中:将映射(或包装映射并提供有用方法的对象)存储到servlet上下文的属性中(可从事件中访问),然后从任意位置检索它:HttpServletRequest提供对servlet上下文的访问

一个更好的解决方案是使用数据库,它在应用程序集群的情况下也可以工作


另外,当会话到期时,不要忘记递减计数器。

这可以存储在Servlet上下文中,如下所示:

@Override
public void contextInitialized(ServletContextEvent event) {
    userMap = new HashMap<String, Map<String,List<ApplicationContextBean>>>();
    event.getServletContext().setAttribute(ApplicationConstants.LOGGED_IN_USERS, userMap);
}
currentSession.getServletContext().getAttribute(LOGGED_IN_USERS)