基于spring-session的Sesion工具类

来源:互联网 发布:加拿大预科知乎 编辑:程序博客网 时间:2024/05/18 02:46

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;}

写一个判断通过何种方式获取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;}

getAttribute、setAttribute:

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> T getAttribute(String key) {    return getAttribute(getSessionIdFromRequest(), key);}public <T> 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> T getAttribute(String key) {        return getAttribute(getSessionIdFromRequest(), key);    }    public <T> 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);    }}

spring boot的配置:

@Beanpublic 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");

2.通过post、get请求的参数传递sessionId
3.通过request请求的head传递sessionId参数(对应代码的fromHean设为true)
4.通过cookie传递sessionId参数(对应代码里的cookieMode设为true)请求中实现以上三种方式中的其中一种可以直接使用sessionUtil工具类:

sessionUtil.setAttribute("userName", "Eric");sessionUtil.getAttribute("userName");

源码可参见GitHub:

https://github.com/rewerma/redis-session


 
原创粉丝点击