package com.hehenian.common.memcache;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.BinaryConnectionFactory;
import net.spy.memcached.MemcachedClient;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.context.ServletContextAware;
public class MemcachedSessionManager implements HttpSessionManager, ServletContextAware,
InitializingBean {
private MemcachedClient memcachedClient;
private String memcachedServers;
private ServletContext servletContext;
public String sessionKey = "sid";
private int sessionTimeout = 60 * 10;
public String cookieDomain = ".hehenian.com";
public String cookiePath = "/";
public MemcachedHttpSession newSession(String sessionId) {
MemcachedHttpSession session = new MemcachedHttpSession(sessionId, memcachedClient);
session.setServletContext(servletContext);
return session;
}
public MemcachedHttpSession getSession(String sessionId) {
if (StringUtils.isEmpty(sessionId)) {
return null;
}
MemcachedClient client = this.memcachedClient;
Object object = client.get(sessionId);
if (object == null) {
return null;
}
MemcachedHttpSession session = newSession(sessionId);
if (object instanceof Map<?, ?>) {
@SuppressWarnings("unchecked")
Map<String, Object> sessionMap = (Map<String, Object>) object;
session.getValueMap().putAll(sessionMap);
}
return session;
}
public boolean exists(String sessionId) {
if (StringUtils.isEmpty(sessionId)) {
return false;
}
return memcachedClient.get(sessionId) != null;
}
public void updateSession(HttpSession session) {
MemcachedHttpSession s = (MemcachedHttpSession) session;
if (s.isUpdated() == false) {
s.update();
}
}
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void afterPropertiesSet() throws Exception {
BinaryConnectionFactory cf = new BinaryConnectionFactory();
memcachedClient = new MemcachedClient(cf, AddrUtil.getAddresses(memcachedServers));
}
public void setMemcachedServers(String memcachedServers) {
this.memcachedServers = memcachedServers;
}
public String getSessionKey() {
return sessionKey;
}
public void setSessionKey(String sessionKey) {
this.sessionKey = sessionKey;
}
public int getSessionTimeout() {
return sessionTimeout;
}
public void setSessionTimeout(int sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
public String getCookieDomain() {
return cookieDomain;
}
public void setCookieDomain(String cookieDomain) {
this.cookieDomain = cookieDomain;
}
public String getCookiePath() {
return cookiePath;
}
public void setCookiePath(String cookiePath) {
this.cookiePath = cookiePath;
}
}