package com.firefly.server.http2.router.handler.session; import com.firefly.utils.exception.CommonRuntimeException; import com.firefly.utils.time.Millisecond100Clock; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; import java.io.Serializable; import java.util.Enumeration; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * @author Pengtao Qiu */ public class HTTPSessionImpl implements HttpSession, Serializable { private volatile int maxInactiveInterval; private final ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<>(); private final long createTime; private final String id; private volatile boolean newSession; private volatile long lastAccessedTime; private volatile boolean invalid; public HTTPSessionImpl(String id) { this.id = id; createTime = Millisecond100Clock.currentTimeMillis(); newSession = true; invalid = false; lastAccessedTime = createTime; } @Override public long getCreationTime() { return createTime; } @Override public String getId() { return id; } @Override public long getLastAccessedTime() { return lastAccessedTime; } public void setLastAccessedTime(long lastAccessedTime) { this.lastAccessedTime = lastAccessedTime; } @Override public ServletContext getServletContext() { return null; } @Override public void setMaxInactiveInterval(int maxInactiveInterval) { this.maxInactiveInterval = maxInactiveInterval; } @Override public int getMaxInactiveInterval() { return maxInactiveInterval; } @Deprecated @Override public HttpSessionContext getSessionContext() { throw new CommonRuntimeException("not implement"); } @Override public Object getAttribute(String name) { return attributes.get(name); } @Deprecated @Override public Object getValue(String name) { throw new CommonRuntimeException("not implement"); } @Override public Enumeration<String> getAttributeNames() { return new Enumeration<String>() { final Iterator<String> iterator = attributes.keySet().iterator(); @Override public boolean hasMoreElements() { return iterator.hasNext(); } @Override public String nextElement() { return iterator.next(); } }; } @Deprecated @Override public String[] getValueNames() { throw new CommonRuntimeException("not implement"); } @Override public void setAttribute(String name, Object value) { attributes.put(name, value); } @Deprecated @Override public void putValue(String name, Object value) { throw new CommonRuntimeException("not implement"); } @Override public void removeAttribute(String name) { attributes.remove(name); } @Deprecated @Override public void removeValue(String name) { throw new CommonRuntimeException("not implement"); } @Override public void invalidate() { invalid = true; } public boolean isInvalid() { return invalid; } @Override public boolean isNew() { return newSession; } public void setNewSession(boolean newSession) { this.newSession = newSession; } public boolean check() { if (isInvalid()) { return false; } else { return getRemainInactiveInterval() > 0; } } public long getRemainInactiveInterval() { long currentTime = Millisecond100Clock.currentTimeMillis(); long inactiveInterval = currentTime - getLastAccessedTime(); return getMaxInactiveInterval() * 1000 - inactiveInterval; } }