`
ahua186186
  • 浏览: 561942 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

shiro 会话原理分析

 
阅读更多

1、从哪里获取sessionid
每次请求都会尝试获取sessionid

获取流程:
DefaultWebSessionManager -->getReferencedSessionId-->getSessionIdCookieValue-->simpleCookie(JSESSIONID)

 

抛出问题:为什么能从cookie中获取sessionid, 请看第3点的初始化

 

如果sessionid不为空,则直接从CachingSessionDAO获取session

 

熟悉这个原理后,我们就可以通过继承DefaultWebSessionManager,自定义getSessionId逻辑实现无状态的会话,而不需要依赖cookie来获取session. --通常也必须这么干才能用于生产环境,除非是一般的企业内部系统。。


2.什么时候创建session
第一步:AbstractShiroFilter包装servletRequest为ShiroHttpServletRequest

protected ServletRequest prepareServletRequest(ServletRequest request, ServletResponse response, FilterChain chain) {
        ServletRequest toUse = request;
        if (request instanceof HttpServletRequest) {
            HttpServletRequest http = (HttpServletRequest)request;
            toUse = this.wrapServletRequest(http);
        }

        return toUse;
    }

 
第二步:  第一次调用了request.getsession()都会创建一个session. 并保存到session仓库中(通常我们自定义CachingSessionDAO保存到redis中)
    ShiroHttpServletRequest里面有个
     

 

 

public HttpSession getSession() {

        return this.getSession(true);

    }

 

 

 

3.创建完session会做哪些初始化操作:AbstractNativeSessionManager,DefaultWebSessionManager  

  

注意:isSessionIdCookieEnabled()开关决定了是否保存sessionid到cookie

  

源代码: 

 

 

public Session start(SessionContext context) {

    Session session = this.createSession(context);

    this.applyGlobalSessionTimeout(session);

    this.onStart(session, context);

    this.notifyStart(session);

    return this.createExposedSession(session, context);

}

   protected void onStart(Session session, SessionContext context) {



    super.onStart(session, context);

    if (!WebUtils.isHttp(context)) {

        log.debug("SessionContext argument is not HTTP compatible or does not have an HTTP request/response pair. No session ID cookie will be set.");

} else {

        HttpServletRequest request = WebUtils.getHttpRequest(context);

HttpServletResponse response = WebUtils.getHttpResponse(context);

        if (this.isSessionIdCookieEnabled()) {

            Serializable sessionId = session.getId();

            this.storeSessionId(sessionId, request, response);

} else {

            log.debug("Session ID cookie is disabled.  No cookie has been set for new session with id {}", session.getId());

}



        request.removeAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE);

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_IS_NEW, Boolean.TRUE);

}

}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    shiro 内存模型分析

    Apache Shiro 是一款轻量级的安全框架,广泛用于 Java 应用程序的身份验证、授权和会话管理。本文将深入探讨 Shiro 内存模型,尤其是整合 Spring 后的架构和工作原理。 在 Shiro 与 Spring 整合启动完成后,内存中...

    Shiro入门到精通

    课程中提供的源码讲解将帮助你深入理解Shiro的内部工作原理。通过分析源码,你可以看到Shiro如何处理认证、授权流程,以及它是如何与其他组件协同工作的。课件则会系统地介绍Shiro的关键概念和实践案例,帮助你巩固...

    跟我学shiro文档及源码

    在《跟我学Shiro》这本书中,作者深入浅出地讲解了 Shiro 的核心概念与实际应用场景,配合源码分析,有助于读者更好地理解和掌握 Shiro 的工作原理。 1. **Shiro 概述** - Shiro 的设计目标是简化应用安全开发,它...

    Shiro安全验证框架

    通过提供的源码,开发者可以深入理解Shiro的内部工作原理,学习如何定制化Shiro以满足特定需求。 9. **开发文档**: 开发文档通常包含了Shiro的安装指南、API参考、使用示例等内容,帮助开发者快速上手并解决实际...

    shiro源码分析

    Shiro源码分析将帮助我们理解其工作原理和核心组件。 首先,Shiro的设计理念可以概括为:简单易用且功能强大。Shiro具有三个核心概念:Subject、SecurityManager和Realms。 1. Subject代表了当前与软件交互的用户...

    Shiro1.2.2_源码(压缩包)

    对于开发者来说,通过学习 Shiro 的源码,可以深入理解其内部工作原理,提高安全编程的能力。在这个 Shiro1.2.2 的源码包中,我们可以探索以下几个关键知识点: 1. **身份认证(Authentication)**:Shiro 提供了...

    shiro-root-1.7.0_ROOT_shirocore1.7_shiro1.7源码_

    在本压缩包中,你获得了Shiro框架的核心部分——shirocore1.7的源代码,版本号为1.7.0,这将对理解Shiro的工作原理及其内部机制大有裨益。 Shiro 的核心组件主要包括以下几个方面: 1. **Authentication(认证)**...

    shiro资料shiro资料

    通过阅读`shiro源码分析(pdf+word)`,你可以深入探究Shiro的内部机制,如`RememberMe`服务、会话管理器的工作流程,以及加密算法的应用等。 总的来说,Apache Shiro是一个全面且易用的Java安全框架,适合各种规模...

    shiro代码示例 web项目

    通过分析和运行这个"shiro代码示例 web项目",你可以更深入地理解Shiro的架构和工作原理,为自己的项目提供安全基础。同时,它也可以作为学习和研究Shiro的最佳实践案例,帮助你在实际开发中快速上手。

    Shiro反序列化流量分析.pdf

    【Shiro反序列化漏洞原理】 Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能。在Shiro中,反序列化漏洞主要出现在RememberMe服务中,该服务允许用户在登录后一段时间内自动保持...

    shiro 反序列化漏洞综合利用工具 shiro_attack_by J1anfen

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了应用安全的实现。在提到的 "shiro_attack_by J1anfen" 工具中,重点是针对 Apache Shiro 的一个特定安全问题:...

    shiro_attack_2.2.zip

    在"shiro_attack_2.2.zip"这个压缩包中,我们可以推测它可能包含了关于Apache Shiro的安全攻击分析或者防御策略,特别是针对其2.2版本的。下面我们将深入探讨Apache Shiro的基本概念、常见攻击以及如何防范这些攻击...

    shiro源码分析二

    在学习Shiro时,源码分析是一个深入了解其内部工作原理的有效方式。本文将继续上一篇文章的案例,深入分析Shiro的Subject和Session机制,以及SecurityManager在创建Subject时所扮演的角色和过程。 首先,Shiro中的...

    最全的安全框架shiro学习视频

    #### 三、Shiro的工作原理 Shiro的核心组件是Subject,它是应用程序和Shiro之间的桥梁。Subject代表了当前用户,它可以调用Shiro的安全服务。Subject将请求转发给SecurityManager,后者负责实际的安全处理。...

    Spring整合Shiro做权限控制模块详细案例分析

    Spring是企业级应用开发的事实标准,而Shiro则是一个轻量级的安全框架,提供了身份验证、授权、会话管理和加密等功能。通过整合这两个框架,我们可以构建出高效且灵活的安全管理体系。 首先,让我们了解Spring和...

    shiro demo 例子

    总之,"Shiro demo 例子" 是一个极好的起点,可以帮助开发者快速上手 Shiro,理解其工作原理,并将这些知识应用于实际项目中,提升应用的安全性。通过实践这个示例,初学者将能够更好地掌握 Java 应用中的安全控制。

    shiro源文件

    通过分析源代码,我们可以深入理解Shiro的工作原理和设计模式。 1. **认证**: Shiro 的认证过程包括身份验证(Authentication)和登录(Login)。身份验证涉及Subject、Realm和CredentialsMatcher等核心组件。...

    shiro学习源码与资料

    Apache Shiro 是一个强大且易用的...通过学习这个压缩包中的资料,你可以系统地掌握Shiro的基本用法,理解其工作原理,并能在实际项目中灵活运用。同时,也可以借此机会深入学习Java安全相关知识,提升自己的专业技能。

    spring+springMVC+shiro 完美例子

    开发者可以解压并运行这个示例,观察其工作原理,学习如何将Shiro与Spring、SpringMVC整合。源代码中,你可能会发现SpringMVC的Controller如何调用Shiro进行认证和授权,以及如何配置Shiro的配置文件(如shiro.ini或...

    shiro_demo.rar

    5. **Shiro会话管理**:Shiro 提供了会话 API,可以跨服务器共享会话数据,支持会话超时、会话固定攻击防护等功能。在分布式系统中,Shiro 可以与 Redis 或其他缓存服务结合,实现分布式会话管理。 6. **测试与实践...

Global site tag (gtag.js) - Google Analytics