redis实现shiro的session共享和保存出错

发布于 2021-12-03 08:52:44 字数 130 浏览 834 评论 13

登录时出错,报该错误

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

清欢 2021-12-06 16:13:49

我使用jeesite工程,把redis作为tomcat的插件使用(就是前台网站登录时,使用tomcat的session,然后配置tocmat的session保存位置为redis,jeesite的代码不改动)发现redis无法保存session信息,但是也不报错。换了一个普通工程,发现session可以共享。

乞讨 2021-12-06 16:13:48

JeeSite  如果用 shiro 做session  共享   是不是没有经过 ehcache,  直接去 redis 取?

够钟 2021-12-06 16:13:47

楼主 我也在做这个 能加QQ请教您吗?

岁月打碎记忆 2021-12-06 16:13:41

谢谢,可以了哦

把昨日还给我 2021-12-06 16:13:36

有这么复杂么?

http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/guides/httpsession-xml.html

我是这么干的。特别要注意的是 spring 版本必须是4.1.6以上!!!

各自安好 2021-12-06 16:12:44

以上是用redis实现接口
SessionDAO 的实现代码

冷弦 2021-12-06 16:12:26

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;

}

}

拍不死你 2021-12-06 15:37:38

以上是shiro的配置文件

南汐寒笙箫 2021-12-06 15:28:01

好的,谢谢你

緦唸λ蓇 2021-12-06 14:16:54

把实现贴出来看看,不然也不知道是什么问题

多彩岁月 2021-12-06 09:14:40

redis做session共享:很明显,楼主说了是共享,肯定是在做WEB分布式集群时为了达到session统一的目的啊!!

泛泛之交 2021-12-04 23:45:27

回复
@longteng556 : 对,说的很专业。很完美。

梦里兽 2021-12-04 15:57:57

不知道你为什么要用redis 实现session 共享,shiro 自带的就有sesseion ,

SecurityUtils.getSubject().getSession是获取session 方式

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文