shiro框架学习-9-shiroSession

Posted enjoyjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro框架学习-9-shiroSession相关的知识,希望对你有一定的参考价值。

 1.什么是会话session : 

  用户和程序直接的链接,程序可以根据session识别到哪个用户,和javaweb中的session类似

 2. 什么是会话管理器SessionManager :

  会话管理器管理所有subject的所有操作,是shiro的核心组件,它是一个接口,定义如下:

public interface SessionManager {
// 开启一个session Session start(SessionContext var1); // 根据指定的key获取session Session getSession(SessionKey var1) throws SessionException; }

   shiro中的会话管理器有多个实现:

技术图片

 

 

 3.  shiroSession 会话存储/持久化:

  shiro的SessionDao接口,提供了session的创建,获取,更新,删除,获取所有session的方法

public interface SessionDAO {
    Serializable create(Session var1);

    Session readSession(Serializable var1) throws UnknownSessionException;

    void update(Session var1) throws UnknownSessionException;

    void delete(Session var1);

    Collection<Session> getActiveSessions();
}

它的实现类如下,自定义缓存管理器,可以继承 AbstractSessionDAO

技术图片

AbstractSessionDAO 源码如下:

package org.apache.shiro.session.mgt.eis;

import java.io.Serializable;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SimpleSession;

public abstract class AbstractSessionDAO implements SessionDAO {
    private SessionIdGenerator sessionIdGenerator = new JavaUuidSessionIdGenerator();

    public AbstractSessionDAO() {
    }

    public SessionIdGenerator getSessionIdGenerator() {
        return this.sessionIdGenerator;
    }

    public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) {
        this.sessionIdGenerator = sessionIdGenerator;
    }
    // shiro默认使用了uuid来产生sessionId,如果需要自定义sessionId,可以实现SessionIdGenerator接口,实现其中的方法
    protected Serializable generateSessionId(Session session) {
        if (this.sessionIdGenerator == null) {
            String msg = "sessionIdGenerator attribute has not been configured.";
            throw new IllegalStateException(msg);
        } else {
            return this.sessionIdGenerator.generateId(session);
        }
    }

    public Serializable create(Session session) {
        Serializable sessionId = this.doCreate(session);
        this.verifySessionId(sessionId);
        return sessionId;
    }

    private void verifySessionId(Serializable sessionId) {
        if (sessionId == null) {
            String msg = "sessionId returned from doCreate implementation is null.  Please verify the implementation.";
            throw new IllegalStateException(msg);
        }
    }

    protected void assignSessionId(Session session, Serializable sessionId) {
        ((SimpleSession)session).setId(sessionId);
    }

    protected abstract Serializable doCreate(Session var1);

    public Session readSession(Serializable sessionId) throws UnknownSessionException {
        Session s = this.doReadSession(sessionId);
        if (s == null) {
            throw new UnknownSessionException("There is no session with id [" + sessionId + "]");
        } else {
            return s;
        }
    }

    protected abstract Session doReadSession(Serializable var1);
}

 4. RememberMe功能

1、 Cookie 写到客户端并 保存
2、 通过调用subject.login()前,设置 token.setRememberMe(true);
3、 关闭浏览器再重新打开;会发现浏览器还是记住你的
4、 注意点:
  - subject.isAuthenticated() 表示用户进行了身份验证登录的,即Subject.login 进行了登录
  - subject.isRemembered() 表示用户是通过RememberMe登录的
  - subject.isAuthenticated()==true,则 subject.isRemembered()==false, 两个互斥
  - 特殊页面或者API调用才需要authc进行验证拦截,该拦截器会判断用户是否是通过 subject.login()登录,安全性更高

 

以上是关于shiro框架学习-9-shiroSession的主要内容,如果未能解决你的问题,请参考以下文章

shiro框架学习-8-shiro缓存

Shiro框架学习

shiro框架学习-3- Shiro内置realm

shiro安全框架学习-1

shiro框架学习-2-springboot整合shiro及Shiro认证授权流程

shiro框架学习-4- Shiro内置JdbcRealm