无法在应用程序级别设置Object(HashMap)

时间:2015-07-31 07:29:02

标签: java spring spring-mvc applicationcontext

我想在应用程序级别设置一个Hashmap对象(登录用户)。但是无法对我在Hashmap对象中保存的旧用户列表的每个请求执行相同的操作,并且只返回当前登录的用户。 我尝试过很多例子,但没有运气。 以下是我的代码

<bean id="applicationContextProvder" class="com.starter.basic.ApplicationContextProvider"/>

<bean id="testBean" class="com.starter.basic.TestBean"/>


TestBean tb = appContext.getApplicationContext().getBean("testBean", TestBean.class)


    public class ApplicationContextProvider implements ApplicationContextAware
     {

    private static ApplicationContext context;

    public ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ac)
            throws BeansException {
        context = ac;
    }
  }


public class TestBean implements ServletContextAware {
    private HashMap hashMap = new HashMap<String ,String >();

 }

  public HashMap getUsers(){
           return hashMap;
   }

框架使用Spring MVC 3 + Hibernate 4.0

如果有人不能理解我的观点。我想要做的是,如果某个用户已经登录并尝试从另一个设备再次登录,则用户应该被阻止。我应该在第二次登录时从Hashmap对象中获取该用户。我可以从后端标志做到这一点。但我的要求是使用应用程序上下文。

2 个答案:

答案 0 :(得分:1)

您的HashMap需要 Singleton Pattern ,而 并发问题 需要使用{{1}确保ConcurrentHashMap

您可以在需要时使用thread safeTestBean.getHashMap()

get, put or remove
当程序在运行时,

class TestBean implements ServletContextAware { private static final HashMap hashMap = new ConcurrentHashMap<String, String>(); public static HashMap getHashMap() { return hashMap; } } 变量将一直存在。

答案 1 :(得分:1)

您应该为bean使用应用程序范围:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-application

您应该在每次登录时将用户添加到hashmap,并在每次注销时将其删除。