登录时出错,报该错误
我使用jeesite工程,把redis作为tomcat的插件使用(就是前台网站登录时,使用tomcat的session,然后配置tocmat的session保存位置为redis,jeesite的代码不改动)发现redis无法保存session信息,但是也不报错。换了一个普通工程,发现session可以共享。
JeeSite 如果用 shiro 做session 共享 是不是没有经过 ehcache, 直接去 redis 取?
楼主 我也在做这个 能加QQ请教您吗?
谢谢,可以了哦
有这么复杂么?
http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/guides/httpsession-xml.html
我是这么干的。特别要注意的是 spring 版本必须是4.1.6以上!!!
以上是用redis实现接口SessionDAO 的实现代码
package com.thinkgem.jeesite.modules.sys.redis;
import java.io.Serializable;import java.util.Collection;import java.util.HashSet;import java.util.Set;
import org.apache.shiro.session.Session;import org.apache.shiro.session.UnknownSessionException;import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;import org.slf4j.Logger;import org.slf4j.LoggerFactory;
import com.thinkgem.jeesite.common.security.shiro.session.SessionDAO;import com.thinkgem.jeesite.modules.sys.utils.SerializeUtils;
public class RedisSessionDAO extends AbstractSessionDAO implements SessionDAO {
private static Logger logger = LoggerFactory.getLogger(RedisSessionDAO.class);/*** shiro-redis的session对象前缀*/private RedisManager redisManager;
/*** The Redis key prefix for the sessions */private String keyPrefix = "shiro_redis_session:";
@Overridepublic void update(Session session) throws UnknownSessionException {this.saveSession(session);}
/*** save session*@param session*@throws UnknownSessionException*/private void saveSession(Session session) throws UnknownSessionException{if(session == null || session.getId() == null){logger.error("session or session id is null");return;}
byte[] key = getByteKey(session.getId());byte[] value = SerializeUtils.serialize(session);session.setTimeout(redisManager.getExpire()*1000);this.redisManager.set(key, value, redisManager.getExpire());}
@Overridepublic void delete(Session session) {if(session == null || session.getId() == null){logger.error("session or session id is null");return;}redisManager.del(this.getByteKey(session.getId()));
}
@Overridepublic Collection<Session> getActiveSessions() {Set<Session> sessions = new HashSet<Session>();
Set<byte[]> keys = redisManager.keys(this.keyPrefix + "*");if(keys != null && keys.size()>0){for(byte[] key:keys){Session s = (Session)SerializeUtils.deserialize(redisManager.get(key));sessions.add(s);}}
return sessions;}
@Overrideprotected Serializable doCreate(Session session) {Serializable sessionId = this.generateSessionId(session); this.assignSessionId(session, sessionId); this.saveSession(session);return sessionId;}
@Overrideprotected Session doReadSession(Serializable sessionId) {if(sessionId == null){logger.error("session id is null");return null;}
Session s = (Session)SerializeUtils.deserialize(redisManager.get(this.getByteKey(sessionId)));return s;}
/*** 获得byte[]型的key* @param key* @return*/private byte[] getByteKey(Serializable sessionId){String preKey = this.keyPrefix + sessionId;return preKey.getBytes();}
public RedisManager getRedisManager() {return redisManager;}
public void setRedisManager(RedisManager redisManager) {this.redisManager = redisManager;
/*** 初始化redisManager*/this.redisManager.init();}
/*** Returns the Redis session keys* prefix.* @return The prefix*/public String getKeyPrefix() {return keyPrefix;}
/*** Sets the Redis sessions key * prefix.* @param keyPrefix The prefix*/public void setKeyPrefix(String keyPrefix) {this.keyPrefix = keyPrefix;}
@Overridepublic Collection<Session> getActiveSessions(boolean includeLeave) {// TODO Auto-generated method stubreturn null;}
@Overridepublic Collection<Session> getActiveSessions(boolean includeLeave,Object principal, Session filterSession) {// TODO Auto-generated method stubreturn null;}
以上是shiro的配置文件
好的,谢谢你
把实现贴出来看看,不然也不知道是什么问题
redis做session共享:很明显,楼主说了是共享,肯定是在做WEB分布式集群时为了达到session统一的目的啊!!
回复@longteng556 : 对,说的很专业。很完美。
不知道你为什么要用redis 实现session 共享,shiro 自带的就有sesseion ,
SecurityUtils.getSubject().getSession是获取session 方式
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(13)
我使用jeesite工程,把redis作为tomcat的插件使用(就是前台网站登录时,使用tomcat的session,然后配置tocmat的session保存位置为redis,jeesite的代码不改动)发现redis无法保存session信息,但是也不报错。换了一个普通工程,发现session可以共享。
JeeSite 如果用 shiro 做session 共享 是不是没有经过 ehcache, 直接去 redis 取?
楼主 我也在做这个 能加QQ请教您吗?
谢谢,可以了哦
有这么复杂么?
http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/guides/httpsession-xml.html
我是这么干的。特别要注意的是 spring 版本必须是4.1.6以上!!!
以上是用redis实现接口
SessionDAO 的实现代码
package com.thinkgem.jeesite.modules.sys.redis;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.thinkgem.jeesite.common.security.shiro.session.SessionDAO;
import com.thinkgem.jeesite.modules.sys.utils.SerializeUtils;
public class RedisSessionDAO extends AbstractSessionDAO implements SessionDAO {
private static Logger logger = LoggerFactory.getLogger(RedisSessionDAO.class);
/**
* shiro-redis的session对象前缀
*/
private RedisManager redisManager;
/**
* The Redis key prefix for the sessions
*/
private String keyPrefix = "shiro_redis_session:";
@Override
public void update(Session session) throws UnknownSessionException {
this.saveSession(session);
}
/**
* save session
*
@param session
*
@throws UnknownSessionException
*/
private void saveSession(Session session) throws UnknownSessionException{
if(session == null || session.getId() == null){
logger.error("session or session id is null");
return;
}
byte[] key = getByteKey(session.getId());
byte[] value = SerializeUtils.serialize(session);
session.setTimeout(redisManager.getExpire()*1000);
this.redisManager.set(key, value, redisManager.getExpire());
}
@Override
public void delete(Session session) {
if(session == null || session.getId() == null){
logger.error("session or session id is null");
return;
}
redisManager.del(this.getByteKey(session.getId()));
}
@Override
public Collection<Session> getActiveSessions() {
Set<Session> sessions = new HashSet<Session>();
Set<byte[]> keys = redisManager.keys(this.keyPrefix + "*");
if(keys != null && keys.size()>0){
for(byte[] key:keys){
Session s = (Session)SerializeUtils.deserialize(redisManager.get(key));
sessions.add(s);
}
}
return sessions;
}
@Override
protected Serializable doCreate(Session session) {
Serializable sessionId = this.generateSessionId(session);
this.assignSessionId(session, sessionId);
this.saveSession(session);
return sessionId;
}
@Override
protected Session doReadSession(Serializable sessionId) {
if(sessionId == null){
logger.error("session id is null");
return null;
}
Session s = (Session)SerializeUtils.deserialize(redisManager.get(this.getByteKey(sessionId)));
return s;
}
/**
* 获得byte[]型的key
* @param key
* @return
*/
private byte[] getByteKey(Serializable sessionId){
String preKey = this.keyPrefix + sessionId;
return preKey.getBytes();
}
public RedisManager getRedisManager() {
return redisManager;
}
public void setRedisManager(RedisManager redisManager) {
this.redisManager = redisManager;
/**
* 初始化redisManager
*/
this.redisManager.init();
}
/**
* Returns the Redis session keys
* prefix.
* @return The prefix
*/
public String getKeyPrefix() {
return keyPrefix;
}
/**
* Sets the Redis sessions key
* prefix.
* @param keyPrefix The prefix
*/
public void setKeyPrefix(String keyPrefix) {
this.keyPrefix = keyPrefix;
}
@Override
public Collection<Session> getActiveSessions(boolean includeLeave) {
// TODO Auto-generated method stub
return null;
}
@Override
public Collection<Session> getActiveSessions(boolean includeLeave,
Object principal, Session filterSession) {
// TODO Auto-generated method stub
return null;
}
}
以上是shiro的配置文件
好的,谢谢你
把实现贴出来看看,不然也不知道是什么问题
redis做session共享:很明显,楼主说了是共享,肯定是在做WEB分布式集群时为了达到session统一的目的啊!!
回复
@longteng556 : 对,说的很专业。很完美。
不知道你为什么要用redis 实现session 共享,shiro 自带的就有sesseion ,
SecurityUtils.getSubject().getSession是获取session 方式