gpt4 book ai didi

java - 将范围与 HttpSessionListener 连接

转载 作者:行者123 更新时间:2023-11-30 09:43:57 25 4
gpt4 key购买 nike

我正在编写一个允许人们协作的 Web 应用程序。我希望我的一些服务仅限于协作(涉及几个人)而不是任何单独的 http session 。我创建了一个自定义的 Scope 来存储 bean。为了管理 bean 生命周期,我跟踪关联的 session ID,如下所示:

protected ConcurrentMap<String,Object> attributes = 
new ConcurrentHashMap<String, Object>();

...
@Override
public Object get(String name, ObjectFactory<?> factory) {
synchronized(this.attributes) {
Object scopedObject = this.attributes.get(name);
if (scopedObject == null) {
scopedObject = factory.getObject();
this.attributes.put(name, scopedObject);
RequestAttributes reqAttrs = RequestContextHolder.currentRequestAttributes();
activeSession(name).add(reqAttrs.getSessionId());

}
return scopedObject;
}
}

当 session 关闭时,我想从与给定 bean 名称关联的 Activity session 列表中删除 session ID。当集合变空时,我可以清理。

我能想到的管理 session 关闭的最简单方法是使用 HttpSessionListener,但我的 Scope 与监听器之间存在断开连接。我看到以下可能性:

  1. 我可以静态创建 HttpSessionListener,假定一个单独的实例,让它管理一个订阅列表,并让我的 Scope 实例订阅它的事件。但这似乎是多余的,而且我不喜欢这种单例模式。

  2. 如果我可以访问 Scope 中的 HttpSession,我可以将 Scope 添加到存储在 session 中的列表中,并让监听器通知该列表的成员 session 即将结束。但我不知道如何在 Scope 实例中获取 session 对象(而不仅仅是它的 ID)。

  3. 我可以让我的 Scope 实现 HttpSessionListener 接口(interface),从而直接更新它的状态,但我不知道如何以编程方式注册监听器。有公开的方法吗?

  4. 有没有更好的方法?

谢谢你的帮助,

基因

最佳答案

没有收到任何评论或答案,我选择了选项 #1,如下所示:

public class SessionMonitor implements HttpSessionListener {
protected final Log logger = LogFactory.getLog(getClass());

protected CopyOnWriteArrayList<SessionEventListener> subscribers = new CopyOnWriteArrayList<SessionEventListener>();
protected ConcurrentHashMap<String,HttpSession> sessions = new ConcurrentHashMap<String,HttpSession>();
protected static SessionMonitor singleton;
public static SessionMonitor soleInstance() throws ConfigurationException {
if (singleton == null)
throw new ConfigurationException("No SessionMonitor instance has been created");
return singleton;
}

public SessionMonitor() {
if (singleton == null)
singleton = this;
}

@Override
public void sessionCreated(HttpSessionEvent e) {
HttpSession session = e.getSession();
this.sessions.putIfAbsent(session.getId(), session);
logger.trace("Registered session " + session.getId());
}

@Override
public void sessionDestroyed(HttpSessionEvent e) {
String sessionId = e.getSession().getId();
this.sessions.remove(sessionId);
for (SessionEventListener listener: subscribers)
listener.sessionEnded(sessionId);
logger.trace("Removed session " + sessionId);
}

public HttpSession getSession(String id) {
return this.sessions.get(id);
}

public void addListener(SessionEventListener listener) {
this.subscribers.add(listener);
logger.trace("Added listener " + listener);
}

public void removeListener(SessionEventListener listener) {
this.subscribers.remove(listener);
logger.trace("Removed listener " + listener);
}
}

当作用域被创建时,它会向 SessionMonitor 注册自己:

public ConditionalScope() throws ConfigurationException {
logger.debug("Registering " + this.toString() + " for session monitoring");
SessionMonitor.soleInstance().addListener(this);
}

但是,我不清楚何时从 SessionMonitor 中删除 Scope。某种类型的 WeakArray 可以在这里工作吗?

关于java - 将范围与 HttpSessionListener 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com