spring-session-data-redis可结合redis实现session的共享,并且使用SessionRepositoryFilter代理了所有session的相关方法。
然鹅,这么牛逼的模块却只能用在session上,不能自定义某些操作,略有不爽。于是自己写了一个session工具类:
private SessionRepository sessionRepository;
public void setSessionRepository(RedisConnectionFactory redisConnectionFactory) {
sessionRepository = new RedisOperationsSessionRepository(redisConnectionFactory);
}
创建session:
public String createSession() {
Session session = sessionRepository.createSession();
if (session == null) {
throw new IllegalStateException("Can not create redis session. ");
}
sessionRepository.save(session);
String sessionId = session.getId();
RequestUtil.getRequest().setAttribute(sessionIdName, sessionId);
if (cookieMode) {
Cookie cookie = new Cookie(sessionIdName, sessionId);
cookie.setPath("/");
cookie.setMaxAge(-1);
ResponseUtil.getResponse().addCookie(cookie);
}
return sessionId;
}
private String getSessionIdFromRequest() {
HttpServletRequest request = RequestUtil.getRequest();
String sessionId = (String) request.getAttribute(sessionIdName);
if (sessionId != null) {
return sessionId;
} else if (cookieMode) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(sessionIdName)) {
sessionId = cookie.getValue();
}
}
}
} else if (fromHead) {
sessionId = request.getHeader(sessionIdName);
} else {
sessionId = request.getParameter(sessionIdName);
}
if (sessionId == null)
throw new IllegalArgumentException("No sessionId param found.");
return sessionId;
}
public void setAttribute(String key, Object value) {
setAttribute(getSessionIdFromRequest(), key, value);
}
public void setAttribute(String sessionId, String key, Object value) {
Session session = sessionRepository.getSession(sessionId);
if (session == null)
return;
session.setAttribute("timestamp_", new Date().getTime());
session.setAttribute(key, value);
sessionRepository.save(session);
}
public T getAttribute(String key) {
return getAttribute(getSessionIdFromRequest(), key);
}
public T getAttribute(String sessionId, String key) {
Session session = sessionRepository.getSession(sessionId);
if (session == null)
return null;
session.setAttribute("timestamp_", new Date().getTime());
sessionRepository.save(session);
return (T) session.getAttribute(key);
}
@SuppressWarnings("unchecked")
public class SessionUtil {
private SessionRepository sessionRepository;
private String sessionIdName = "token";
private boolean fromHead = false;
private boolean cookieMode = false;
public void setSessionIdName(String sessionIdName) {
this.sessionIdName = sessionIdName;
}
public String getSessionIdName() {
return sessionIdName;
}
public void setSessionRepository(RedisConnectionFactory redisConnectionFactory) {
sessionRepository = new RedisOperationsSessionRepository(redisConnectionFactory);
}
public void setFromHead(boolean fromHead) {
this.fromHead = fromHead;
}
public void setCookieMode(boolean cookieMode) {
this.cookieMode = cookieMode;
}
public void setMaxInactive(int maxInactive) {
((RedisOperationsSessionRepository) sessionRepository).setDefaultMaxInactiveInterval(maxInactive);
}
public void setNamespace(String namespace) {
if (namespace != null)
((RedisOperationsSessionRepository) sessionRepository).setRedisKeyNamespace(namespace);
}
public String createSession() {
Session session = sessionRepository.createSession();
if (session == null) {
throw new IllegalStateException("Can not create redis session. ");
}
sessionRepository.save(session);
String sessionId = session.getId();
RequestUtil.getRequest().setAttribute(sessionIdName, sessionId);
if (cookieMode) {
Cookie cookie = new Cookie(sessionIdName, sessionId);
cookie.setPath("/");
cookie.setMaxAge(-1);
ResponseUtil.getResponse().addCookie(cookie);
}
return sessionId;
}
private String getSessionIdFromRequest() {
HttpServletRequest request = RequestUtil.getRequest();
String sessionId = (String) request.getAttribute(sessionIdName);
if (sessionId != null) {
return sessionId;
} else if (cookieMode) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(sessionIdName)) {
sessionId = cookie.getValue();
}
}
}
} else if (fromHead) {
sessionId = request.getHeader(sessionIdName);
} else {
sessionId = request.getParameter(sessionIdName);
}
if (sessionId == null)
throw new IllegalArgumentException("No sessionId param found.");
return sessionId;
}
public void setAttribute(String key, Object value) {
setAttribute(getSessionIdFromRequest(), key, value);
}
public void setAttribute(String sessionId, String key, Object value) {
Session session = sessionRepository.getSession(sessionId);
if (session == null)
return;
session.setAttribute("timestamp_", new Date().getTime());
session.setAttribute(key, value);
sessionRepository.save(session);
}
public T getAttribute(String key) {
return getAttribute(getSessionIdFromRequest(), key);
}
public T getAttribute(String sessionId, String key) {
Session session = sessionRepository.getSession(sessionId);
if (session == null)
return null;
session.setAttribute("timestamp_", new Date().getTime());
sessionRepository.save(session);
return (T) session.getAttribute(key);
}
public void removeAttribute(String key) {
removeAttribute(getSessionIdFromRequest(), key);
}
public void removeAttribute(String sessionId, String key) {
Session session = sessionRepository.getSession(sessionId);
if (session == null)
return;
session.setAttribute("timestamp_", new Date().getTime());
session.removeAttribute(key);
sessionRepository.save(session);
}
public void invalidate() {
invalidate(getSessionIdFromRequest());
}
public void invalidate(String sessionId) {
sessionRepository.delete(sessionId);
}
}
@Bean
public SessionUtil sessionUtil(RedisConnectionFactory factory) {
SessionUtil sessionUtil = new SessionUtil();
sessionUtil.setSessionRepository(factory);
sessionUtil.setMaxInactive(3600);
sessionUtil.setNamespace("xxx");
// sessionUtil.setCookieMode(true);
return sessionUtil;
}
1.最基本的方式,通过sessionId直接调用:
sessionUtil.setAttribute(sessionId, "userName", "Eric");
sessionUtil.getAttribute(sessionId, "userName");
sessionUtil.setAttribute("userName", "Eric");
sessionUtil.getAttribute("userName");
https://github.com/rewerma/redis-session