java shiro整合memcache
时间: 2023-07-06 19:20:45 浏览: 56
Java Shiro可以很方便地与Memcached进行整合,以实现Session的存储和管理。
下面是整合步骤:
1. 首先需要添加Memcached的相关依赖,可以使用Maven来管理依赖,添加以下代码到pom.xml文件中:
```xml
<dependency>
<groupId>com.whalin</groupId>
<artifactId>Memcached-Java-Client</artifactId>
<version>3.0.2</version>
</dependency>
```
2. 在Shiro的配置文件(shiro.ini或shiro.yml)中配置Session的管理方式为Memcached,例如:
```ini
[main]
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
[session]
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.globalSessionTimeout = 1800000
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionDAO.activeSessionsCacheName = shiro-activeSessionCache
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.cacheManager = $cacheManager
# Memcached session
# =======================================
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionDAO.activeSessionsCacheName = shiro-activeSessionCache
sessionDAO.sessionIdGenerator = org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator
cacheManager = com.whalin.MemCached.MemCachedClientPoolCacheManager
cacheManager.poolName = shiroCache
cacheManager.servers = 127.0.0.1:11211
securityManager.cacheManager = $cacheManager
sessionManager.sessionDAO = $sessionDAO
sessionManager.cacheManager = $cacheManager
```
其中,cacheManager配置使用了MemoryConstrainedCacheManager和EhCacheManager,用于缓存Shiro的授权信息和其他缓存数据;sessionDAO配置使用了EnterpriseCacheSessionDAO,用于管理Session的存储和读取;cacheManager配置使用了MemCachedClientPoolCacheManager,用于与Memcached进行交互。
3. 在项目启动时,需要创建Memcached客户端并将其注入到cacheManager中,例如:
```java
import com.whalin.MemCached.MemCachedClient;
import com.whalin.MemCached.SockIOPool;
public class MemcachedCacheManager implements CacheManager {
private MemCachedClient cache;
@Override
public <K, V> Cache<K, V> getCache(String name) throws CacheException {
return new MemcachedCache<>(name, this.cache);
}
public void init() {
String[] servers = {"127.0.0.1:11211"};
SockIOPool pool = SockIOPool.getInstance("shiroCache");
pool.setServers(servers);
pool.initialize();
this.cache = new MemCachedClient("shiroCache");
}
public void destroy() {
SockIOPool.getInstance("shiroCache").shutDown();
}
}
```
4. 在Web应用中,可以使用DefaultWebSessionManager来管理Session,例如:
```java
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
public class MemcachedSessionManager extends DefaultWebSessionManager {
@Override
protected void onStart(Session session, SessionContext context) {
super.onStart(session, context);
// 将Session存储到Memcached中
this.getSessionDAO().create(session);
}
@Override
protected void onStop(Session session, SessionKey key) {
super.onStop(session, key);
// 从Memcached中删除Session
this.getSessionDAO().delete(session);
}
@Override
protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
// 从Memcached中读取Session
Session session = this.getSessionDAO().readSession(sessionKey);
if (session == null) {
throw new UnknownSessionException("Session not found with key: " + sessionKey);
}
return session;
}
}
```
通过以上步骤,就可以将Java Shiro与Memcached整合起来,实现Session的存储和管理。