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

时间:2014-02-25 06:45:39

标签: session servlets struts-1

我获得了一个用例,提出了一个解决方案,允许每个用户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>

问题:我现在如何从我的动作类中访问此上下文对象'us​​erMap'?如果有人有任何其他方法也不同于此,请发布相同的。 感谢

2 个答案:

答案 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)