`
suichangkele
  • 浏览: 198136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shiro学习09-用户以及登录-sessionManager

阅读更多

上面说了shiro对httpSession的封装,封装成shiro自己的session类,这里说如何建立shiro的session——SessionManager类。

SessionManager用于管理shirosession的创建(不是httpSession),默认使用的是ServletContainerSessionManager,在defaultWebSecurityManager创建的时候就会实例化一个ServletContainerSessionManager实例。

源码如下:

public DefaultWebSecurityManager() {

        super();

        ((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());

        this.sessionMode = HTTP_SESSION_MODE;

        setSubjectFactory(new DefaultWebSubjectFactory());

        setRememberMeManager(new CookieRememberMeManager());

        setSessionManager(new ServletContainerSessionManager());//创建sessionManager

}

 

关于创建session的源码

public Session getSession(SessionKey key) throws SessionException {

        if (!WebUtils.isHttp(key)) {

            String msg = "SessionKey must be an HTTP compatible implementation.";

            throw new IllegalArgumentException(msg);

        }

 

        HttpServletRequest request = WebUtils.getHttpRequest(key);

 

        Session session = null;

 

        HttpSession httpSession = request.getSession(false);//第一次访问时返回null

        if (httpSession != null) {//不会创建HttpServletSession

            session = createSession(httpSession, request.getRemoteHost());

        }

 

        return session;

    }

//createSession的方法:

protected Session createSession(HttpSession httpSession, String host) {

     return new HttpServletSession(httpSession, host);

}

从源码中可以看出:在浏览器发起第一次请求时shiro是不会涉及到任何session的,包括httpSession,他的调用HttpServletRequest.getSession(false),这个方法在第一次请求时返回的null但是在以后(也就是不是第一次访问)时就会产生获得httpSession.

但是只有一种情况例外,就是第一次就是登陆的情况,在登陆候,同样会调用这个方法:org.apache.shiro.mgt.DefaultSubjectDAO.save(Subject)(只要访问就会调用,包括第一次访问时),但是如果第一次访问就是登录而且登录成功,那么这个subjectprincipalCollection就不是空,我们看一下save方法中调用的两个merger方法的部分源码:

Session session = subject.getSession(false);//仍然是false调用,第一次访问的话返回的仍然是空,

 

if (session == null) {

      if (!CollectionUtils.isEmpty(currentPrincipals)) {//但是如果已经登录成功则这个条件满足,

           session = subject.getSession();//这里就不再返回null,在delegatingSubject的源码中可以发现,

           session.setAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY, currentPrincipals);

      }

 

这里的subjectDelegatingSubject,我们再看一下他的getSession方法

public Session getSession() {

        return getSession(true);

}   然后在getSession(Boolean)方法中最终调用的是servetContainerSessionManager. createSession (sessionContext),里面调用的HttpServletRequest.getSession()这里我们就发现了这时候才会真正的取得session.

 

 

以上说的是第一次访问的时候session的获取以及封装,不是第一次的话通过第一次的getSeesion(False)就能获得session了,然后进行封装。

 

 

分享到:
评论

相关推荐

    shiro-root-1.4.1-source-release.zip

    4. **会话管理(Session Management)**:Shiro 可以跨多个应用服务器管理用户的会话,这在分布式环境中尤其有用。它还提供了会话监听器,以便在会话创建、更新或销毁时执行自定义操作。 在 `shiro-root-1.4.1` ...

    shiro-root-1.3.2-source-release

    `SessionManager` 和 `SessionDAO` 接口分别负责会话的生命周期管理和持久化。 4. **加密**(Cryptography):Shiro 提供了多种加密工具,如哈希函数、密钥生成器、加密算法等,帮助开发者安全地处理敏感数据。 5....

    shiro-root-1.32-source-release

    6. **核心组件**:在 `core` 文件夹中,包含了 Shiro 的核心组件,如 Subject、SecurityManager、SessionManager 等,这些是 Shiro 实现其功能的基础。 7. **工具与支持**:`tools` 和 `support` 文件夹中包含了...

    shiro-redisson基于Redis的ShiroCache和Session实现

    然后,配置 Shiro 使用 Redisson 的 CacheManager 和 SessionManager 实例。 5. **安全性考虑** 在使用 Redis 存储敏感数据(如用户会话信息)时,需要注意数据的安全性。例如,可以启用 Redis 的数据加密传输,...

    shiro源码(shiro-root-1.8.0-source-release.zip)

    SessionManager和SessionDAO是关键组件,分别处理会话的生命周期管理和持久化。 4. **加密**: Shiro提供了多种加密工具,如DigestUtils、Encoders和Cryptography,用于密码哈希、消息摘要和加解密操作。这使得...

    shiro-redis-session-master.zip

    5. 应用配置:在Shiro的配置文件(如`shiro.ini`或Java配置类)中启用新的SessionManager。 通过这些步骤,Shiro就能使用Redis来存储和同步会话,确保在分布式环境下的用户会话一致性。 **五、权限管理** 在Shiro...

    shiro-all jar

    11. **org.apache.shiro.mgt**: 安全管理,包括安全管理器(SecurityManager)、会话管理器(SessionManager)等核心组件的管理。 12. **org.apache.shiro.util**: 工具类和辅助类,提供通用的实用方法和辅助功能。...

    shiro-单用户登录.zip

    通过"shiro-单用户登录.zip"中的示例代码,你可以深入了解Shiro如何实现单用户的登录逻辑,以及它如何与你的应用进行集成。在实际项目中,可以基于这些知识进一步扩展,实现多用户登录、权限更复杂的控制等高级功能...

    shiro-root-1.2.3-source-release源码带注释.rar

    `SessionManager`和`SessionDAO`接口处理会话的创建、读取、更新和删除。通过扩展这些接口,开发者可以定制会话存储策略,例如使用内存、数据库或分布式缓存。 5. **加密服务** Shiro提供了丰富的加密工具,如`...

    shiro源码(shiro-root-1.10.0-source-release.zip)

    `SessionManager`和`SessionDAO`是关键组件,前者负责会话的生命周期管理,后者处理会话的存储和检索。 4. **加密**:Shiro 提供了多种加密工具,如密码散列、密钥生成和加密/解密算法,如MD5、SHA、AES等。`...

    liu_guo_feng-shiro-demo-master_java_源码.zip

    在liu_guo_feng-shiro-demo-master_java项目中,可以看到Shiro的实战应用,如用户登录、权限控制、会话管理等示例,这些代码可以帮助我们更好地理解和运用Shiro。 通过分析这个源码示例,我们可以学习到如何在实际...

    apache-shiro-1-2-x-reference.zip

    它可以在分布式环境中通过SessionManager和SessionDAO进行会话复制,实现跨服务器的会话共享。此外,Shiro还可以帮助检测并发登录,防止会话劫持和会话固定攻击。 **Web支持** Shiro不仅适用于传统的Java应用,也...

    shiro 安全框架--最好的中文配置文档

    1. **认证**:Shiro 提供了身份验证(Authentication)机制,允许用户登录并验证其身份。这包括用户名/密码验证,以及其他身份证明方式如数字证书、指纹等。 2. **授权**:授权(Authorization)是控制用户访问资源...

    shiro-redis-master.zip

    在这个过程中,你需要确保Realm使用RedisManager来获取和存储用户会话信息。 4. 配置SessionDAO:Shiro的SessionDAO(Session Data Object Access Object)负责会话的创建、读取、更新和删除操作。这里需要配置成...

    shiro常用jar包-1.2.2

    `SessionManager`接口用于控制会话的创建、更新和销毁,`SessionDAO`接口则负责会话数据的持久化。 5. **加密支持** Shiro提供了一些基础的加密工具,如`org.apache.shiro.crypto.hash.Hash`类用于密码哈希,`...

    springboot-shiro认证系统框架--成型框架

    - 在分布式环境中,Shiro的会话管理可以通过SessionManager和SessionDAO进行定制,如使用Redis或Memcached存储会话,实现会话共享。 - 跨节点的身份验证和授权,可以通过Token传递或JWT(JSON Web Tokens)实现。 ...

    shiro学习示例

    - **SessionManager**:处理用户会话,支持分布式会话。 - **Authenticator**:负责用户身份验证。 - **Authorizer**:负责权限判定。 - **CacheHandler**:缓存处理器,与CachingManager配合使用。 4. **Shiro...

    Shiro全面教程

    Shiro 的核心组件包括 Realm(领域)、Subject(主体)、Session Manager(会话管理器)和 Cache Manager(缓存管理器)。 Realm 是连接应用和安全数据源的桥梁,负责验证用户身份。Subject 是 Shiro 中的主要交互...

    Shiro教程-孙开涛

    - **登录/退出**:这是Shiro中最基础的操作之一,通过配置Shiro的`LoginController`等类来实现用户登录和注销的过程。 - **身份认证流程**: - **Realm**:Realm是Shiro的核心概念之一,它是Shiro与应用安全数据的...

Global site tag (gtag.js) - Google Analytics