Java 优雅地检查HTTPSession引用是否仍然有效
我将所有已建立的HTTPSession对象存储在哈希映射中。是 确定HTTPSession是否仍然有效的方法不多 在排队等候消息之前 示例:如果我对哈希进行迭代- 映射时,我只想将以下HTTPSession对象的消息排队 有效 更新Java 优雅地检查HTTPSession引用是否仍然有效,java,httpsession,Java,Httpsession,我将所有已建立的HTTPSession对象存储在哈希映射中。是 确定HTTPSession是否仍然有效的方法不多 在排队等候消息之前 示例:如果我对哈希进行迭代- 映射时,我只想将以下HTTPSession对象的消息排队 有效 更新 如果有人感兴趣,我需要使用gwt comet的这种逻辑。解决方案(正如Tomasz Nurkiewicz指出的)可以在页面底部找到。不幸的是,没有明确的API用于此。但它很容易以干净优雅的方式解决问题 实现将每个新创建的会话存储在并发映射中,并在会话被破坏时将其删除
如果有人感兴趣,我需要使用gwt comet的这种逻辑。解决方案(正如Tomasz Nurkiewicz指出的)可以在页面底部找到。不幸的是,没有明确的API用于此。但它很容易以干净优雅的方式解决问题 实现将每个新创建的会话存储在并发映射中,并在会话被破坏时将其删除。这样,地图将始终只包含有效会话。干净多了,你不觉得吗
public class SessionStoringListener implements HttpSessionListener {
private Map<String, HttpSession> sessions = new ConcurrentHashMap<String, HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent)
{
HttpSession session = httpSessionEvent.getSession();
sessions.put(session.getId(), session);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
{
sessions.remove(httpSessionEvent.getSession().getId());
}
}
公共类SessionStoringListener实现HttpSessionListener{
私有映射会话=新的ConcurrentHashMap();
@凌驾
已创建公共无效会话(HttpSessionEvent HttpSessionEvent)
{
HttpSession session=httpSessionEvent.getSession();
sessions.put(session.getId(),session);
}
@凌驾
公共无效sessionDestroyed(HttpSessionEvent HttpSessionEvent)
{
移除(httpSessionEvent.getSession().getId());
}
}
小心点,还有比赛条件。您仍然需要使用会话来处理错误。@Yuliy:您能再详细说明一下吗?我必须承认我在这里找不到比赛条件,我不知道你说的错误是什么意思。提前感谢。竞争是如果一个线程从容器中获取了一个HttpSession,而它却被另一个线程破坏了。