JedisSessionDAO.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package com.kmall.common.security.session;
  2. import com.kmall.common.Global;
  3. import com.kmall.common.utils.ServletUtils;
  4. import com.kmall.common.utils.redis.JedisUtil;
  5. import org.apache.shiro.session.Session;
  6. import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import javax.servlet.http.HttpServletRequest;
  10. import java.io.Serializable;
  11. /**
  12. * 自定义授权会话管理类
  13. *
  14. * @author zhuliyun
  15. */
  16. public class JedisSessionDAO extends EnterpriseCacheSessionDAO {
  17. private Logger logger = LoggerFactory.getLogger(getClass());
  18. private String sessionKeyPrefix = "shiro_session_";
  19. // session 在redis过期时间是30分钟30*60
  20. private static int expireTime = 1800;
  21. // 创建session,保存到数据库
  22. @Override
  23. protected Serializable doCreate(Session session) {
  24. Serializable sessionId = super.doCreate(session);
  25. logger.debug("创建session:{}", session.getId().toString());
  26. HttpServletRequest request = ServletUtils.getRequest();
  27. if (request != null) {
  28. String uri = request.getServletPath();
  29. // 如果是静态文件,则不创建SESSION
  30. if (ServletUtils.isStaticFile(uri)) {
  31. return null;
  32. }
  33. }
  34. JedisUtil.setObject(sessionKeyPrefix + session.getId().toString(), session, expireTime);
  35. return sessionId;
  36. }
  37. // 获取session
  38. @Override
  39. protected Session doReadSession(Serializable sessionId) {
  40. logger.debug("获取session:{}", sessionId);
  41. // 先从缓存中获取session,如果没有再去数据库中获取
  42. Session session = (Session) JedisUtil.getObject(sessionKeyPrefix + sessionId.toString());
  43. return session;
  44. }
  45. // 更新session的最后一次访问时间
  46. @Override
  47. protected void doUpdate(Session session) {
  48. // super.doUpdate(session);
  49. logger.debug("获取session:{}", session.getId());
  50. String key = sessionKeyPrefix + session.getId().toString();
  51. HttpServletRequest request = ServletUtils.getRequest();
  52. if (request != null) {
  53. String uri = request.getServletPath();
  54. // 如果是静态文件,则不更新SESSION
  55. if (ServletUtils.isStaticFile(uri)) {
  56. return;
  57. }
  58. // 手动控制不更新SESSION
  59. if (Global.NO.equals(request.getParameter("updateSession"))) {
  60. return;
  61. }
  62. }
  63. if (null == JedisUtil.getObject(key)) {
  64. return;
  65. }
  66. JedisUtil.expire(key, expireTime);
  67. }
  68. // 删除session
  69. @Override
  70. protected void doDelete(Session session) {
  71. if (session == null || session.getId() == null) {
  72. return;
  73. }
  74. logger.debug("删除session:{}", session.getId());
  75. // super.doDelete(session);
  76. JedisUtil.del(sessionKeyPrefix + session.getId().toString());
  77. }
  78. public String getSessionKeyPrefix() {
  79. return sessionKeyPrefix;
  80. }
  81. public void setSessionKeyPrefix(String sessionKeyPrefix) {
  82. this.sessionKeyPrefix = sessionKeyPrefix;
  83. }
  84. public static int getExpireTime() {
  85. return expireTime;
  86. }
  87. public static void setExpireTime(int expireTime) {
  88. JedisSessionDAO.expireTime = expireTime;
  89. }
  90. }