问答详情
源自:5-1 Shiro会话管理1

protected Serializable doCreate(Session session) 这个方法中的sessionId是做什么的?

protected Serializable doCreate(Session session) {
      Serializable sessionId = generateSessionId(session);   
      byte[] key = getKey(session.getId().toString());  
      byte[] value = SerializationUtils.serialize(session);  
      jedisUtil.set(key,value);  jedisUtil.expire(key,600);  
      return sessionId;
}

但是在存入Redis用的确是session.getId()

private void saveSession(Session session){
    if (session!=null&&session.getId()!=null){
        byte[] key = getKey(session.getId().toString());//添加前缀
        byte[] value = SerializationUtils.serialize(session); //将session序列化,以便存入redis
        jedisUtil.set(key,value);
        jedisUtil.expire(key,600);
    }
}

我不明白下面这个操作是做什么用的:

Serializable sessionId = generateSessionId(session);

然后在获取的时候用的是这个 Serializable sessionId

protected Session doReadSession(Serializable sessionId) {
    System.out.println("read session");
    if (sessionId==null){
        return null;
    }
    byte[] key = getKey(sessionId.toString());//添加key的前缀
    byte[] value = jedisUtil.get(key);
    return (Session)SerializationUtils.deserialize(value); //反序列化
}

存入的时候是使用的是直接从session.getId()没有序列化的,读取的时候是序列化的

提问者:未卜先知 2018-07-22 17:55

个回答

  • 九分石人
    2019-04-16 22:57:16

    在以后你需要从redis中拿去session时是要使用的

    protected Session doReadSession(Serializable sessionId) {
        if (sessionId == null) {
    	return null;
        }
        byte[] key = getKey(sessionId.toString());		
        byte[] value = jedisUtil.get(key);		
        return (Session) SerializationUtils.deserialize(value);
    }


  • 未卜先知
    2018-07-22 20:42:24

    发现答案在第二部分的1分40秒,这里忘了把id和session做关联