• 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()登录,安全性更高

  • 相关阅读:
    tracert命令与tracert (IP地址)-d有什么区别?
    linux下通过进程名查看其占用端口
    Union和Union All的区别
    外连接、内连接
    Linux 删除文件夹和文件的命令(强制删除包括非空文件)
    linux查看当前目录
    Linux chmod命令及权限含义
    MySQL的if,case语句
    case when
    java生成验证码图片
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/12089473.html
Copyright © 2020-2023  润新知