package org.eh.core.http;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.eh.core.util.StringUtil;
import com.sun.net.httpserver.HttpExchange;
/**
* 全局数据和会话相关数据,单例
* @author guojing
* @date 2014-3-17
*/
public class ApplicationContext {
private Map<String, Object> appMap = new HashMap<String, Object>(); // ApplicationContext全局数据
/**
* 这里自己也有点搞不清sessionMap是不是有必要考虑线程安全
*/
private ConcurrentMap<String, HttpSession> sessionMap = new ConcurrentHashMap<String, HttpSession>(); // session数据
private ApplicationContext(){
}
/**
* 内部类实现单例
*/
private static class ApplicationContextHolder {
private static ApplicationContext instance = new ApplicationContext();
}
public static ApplicationContext getApplicationContext() {
return ApplicationContextHolder.instance;
}
public void addAttribute(String name, Object value) {
ApplicationContextHolder.instance.appMap.put(name, value);
}
public Object getAttribute(String name) {
return ApplicationContextHolder.instance.appMap.get(name);
}
public Map<String, Object> getAllAttribute() {
return ApplicationContextHolder.instance.appMap;
}
public Set<String> getAllNames() {
return ApplicationContextHolder.instance.appMap.keySet();
}
public boolean containsName(String name) {
return ApplicationContextHolder.instance.appMap.containsKey(name);
}
public void addSession(String sessionId) {
HttpSession httpSession = new HttpSession();
httpSession.setLastVisitTime(new Date());
ApplicationContextHolder.instance.sessionMap.put(sessionId, httpSession);
}
/**
* 获取session
*/
public HttpSession getSession(HttpExchange httpExchange) {
String sessionId = getSessionId(httpExchange);
if (StringUtil.isEmpty(sessionId)) {
return null;
}
HttpSession httpSession = ApplicationContextHolder.instance.sessionMap.get(sessionId);
if (null == httpSession) {
httpSession = new HttpSession();
ApplicationContextHolder.instance.sessionMap.put(sessionId, httpSession);
}
return httpSession;
}
/**
* 获取sessionId
*/
public String getSessionId(HttpExchange httpExchange) {
String cookies = httpExchange.getRequestHeaders().getFirst("Cookie");
String sessionId = "";
if (StringUtil.isEmpty(cookies)) {
cookies = httpExchange.getResponseHeaders().getFirst("Set-Cookie");
}
if (StringUtil.isEmpty(cookies)) {
return null;
}
String[] cookiearry = cookies.split(";");
for(String cookie : cookiearry){
cookie = cookie.replaceAll(" ", "");
if (cookie.startsWith("EH_SESSION=")) {
sessionId = cookie.replace("EH_SESSION=", "").replace(";", "");
}
}
return sessionId;
}
/**
* 获取所有session
*/
public ConcurrentMap<String, HttpSession> getAllSession() {
return ApplicationContextHolder.instance.sessionMap;
}
/**
* 设置session最后访问时间
*/
public void setSessionLastTime(String sessionId) {
HttpSession httpSession = ApplicationContextHolder.instance.sessionMap.get(sessionId);
httpSession.setLastVisitTime(new Date());
}
}