shiro集成redis实现session集群共享

好处

  1. session在tomcat集群中共享(单点登录)
  2. tomcat重启后会话不丢失

实现

覆写EnterpriseCacheSessionDAO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.kangyonggan.blog.web.shiro;

import com.kangyonggan.api.common.service.RedisService;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;

/**
* @author kangyonggan
* @since 2016/12/31
*/
public class MyEnterpriseCacheSessionDAO extends EnterpriseCacheSessionDAO {

@Autowired
private RedisService redisService;

/**
* 创建session,保存到redis数据库
*
* @param session
* @return
*/
@Override
protected Serializable doCreate(Session session) {
Serializable sessionId = super.doCreate(session);
redisService.set(sessionId.toString(), session);

return sessionId;
}

/**
* 获取session
*
* @param sessionId
* @return
*/
@Override
protected Session doReadSession(Serializable sessionId) {
// 先从缓存中获取session,如果没有再去数据库中获取
Session session = super.doReadSession(sessionId);
if (session == null) {
session = (Session) redisService.get(sessionId.toString());
}
return session;
}

/**
* 更新session的最后一次访问时间
*
* @param session
*/
@Override
protected void doUpdate(Session session) {
super.doUpdate(session);
redisService.set(session.getId().toString(), session);
}

/**
* 删除session
*
* @param session
*/
@Override
protected void doDelete(Session session) {
super.doDelete(session);
redisService.delete(session.getId().toString());
}

}

但是一般还是别在集群中使用session。