package me.test.redis;
import java.security.SecureRandom;
import java.util.Random;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import me.test.MySessionFilter;
import me.test.SessionManager;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
public class MySessionManager implements SessionManager {
private Logger logger = LoggerFactory.getLogger(MySessionManager.class);
private Random random = new SecureRandom();
private String sessionPath;
private String sessionIdCookieName = "JSESSIONID";
// private String sessionIdPathParameterNamePrefix = ";" + sessionCookieName + "="; FIXME
private String sessionIdUrlMatrixParamName = "jsessionid";
private int timeout = 30;
private RedisTemplate<String, Object> redisTemplate;
public HttpSession newHttpSession() {
// 创建SessionId
byte[] randomBytes = new byte[6];
String id;
do {
random.nextBytes(randomBytes);
id = Base64.encodeBase64String(randomBytes);
} while (redisTemplate.hasKey(id));
// 创建session
MySession session = new MySession(id, this);
// 初始化session
long curTimeMillis = System.currentTimeMillis();
redisTemplate.opsForHash().put(session.getRedisHashKey(), MySession.MEATDATA_KEY_CREATE_TIME, curTimeMillis);
session.setMaxInactiveInterval(timeout * 60);
Cookie cookie = this.newSessionCookie(session.getId());
MySessionFilter.responseHolder.get().addCookie(cookie);
return session;
}
public String getSessionPath() {
if (StringUtils.isEmpty(sessionPath)) {
return MySessionFilter.servletContextHolder.get().getContextPath();
}
return sessionPath;
}
public HttpSession getHttpSession(String sessionId) {
if (!isSessionValid(sessionId)) {
return null;
}
// 创建session
MySession session = new MySession(sessionId, this);
return session;
}
public void setSessionPath(String sessionPath) {
this.sessionPath = sessionPath;
}
public void setSessionIdCookieName(String sessionIdCookieName) {
if (StringUtils.isBlank(sessionIdCookieName)) {
throw new IllegalArgumentException("session cookie name can not be empty");
}
this.sessionIdCookieName = sessionIdCookieName;
}
public String getSessionIdUrlMatrixParamName() {
return sessionIdUrlMatrixParamName;
}
public void setSessionIdUrlMatrixParamName(String sessionIdUrlMatrixParamName) {
this.sessionIdUrlMatrixParamName = sessionIdUrlMatrixParamName;
}
// public String getSessionIdPathParameterNamePrefix() {
//
// return sessionIdPathParameterNamePrefix;
// }
//
// public void setSessionIdPathParameterNamePrefix(String sessionIdPathParameterNamePrefix) {
//
// this.sessionIdPathParameterNamePrefix = sessionIdPathParameterNamePrefix;
// }
public ServletContext getServletContext() {
return MySessionFilter.servletContextHolder.get();
}
public void accessSession(HttpSession session) {
MySession mySession = (MySession) session;
mySession.access();
}
public HttpServletRequest wrapHttpSevletRequest() {
return new MyRequest(this);
}
public HttpServletResponse wrapHttpSevletResponse() {
return new MyResponse(this);
}
private Cookie newSessionCookie(String sessionId) {
HttpServletRequest request = MySessionFilter.requestHolder.get();
Cookie cookie = new Cookie(getSessionIdCookieName(), sessionId);
cookie.setSecure(request.isSecure());
cookie.setMaxAge(-1);
String path = sessionPath != null ? sessionPath : request.getContextPath();
path = (path == null || path.length() == 0) ? "/" : path;
cookie.setPath(path);
return cookie;
}
public boolean isSessionValid(String sessionId) {
return redisTemplate.hasKey(getRedisHashKey(sessionId));
}
public String getSessionIdCookieName() {
return sessionIdCookieName;
}
String getRedisHashKey(String sessionId) {
return MySession.PREFIX + "." + sessionId;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public RedisTemplate<String, Object> getRedisTemplate() {
return redisTemplate;
}
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public HttpSession newHttpSession(HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
}
// public boolean isUsingCookies() {
//
// return true;
// }
}