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); } }
相关推荐
Apache Shiro 是一款轻量级的安全框架,广泛用于 Java 应用程序的身份验证、授权和会话管理。本文将深入探讨 Shiro 内存模型,尤其是整合 Spring 后的架构和工作原理。 在 Shiro 与 Spring 整合启动完成后,内存中...
课程中提供的源码讲解将帮助你深入理解Shiro的内部工作原理。通过分析源码,你可以看到Shiro如何处理认证、授权流程,以及它是如何与其他组件协同工作的。课件则会系统地介绍Shiro的关键概念和实践案例,帮助你巩固...
在《跟我学Shiro》这本书中,作者深入浅出地讲解了 Shiro 的核心概念与实际应用场景,配合源码分析,有助于读者更好地理解和掌握 Shiro 的工作原理。 1. **Shiro 概述** - Shiro 的设计目标是简化应用安全开发,它...
通过提供的源码,开发者可以深入理解Shiro的内部工作原理,学习如何定制化Shiro以满足特定需求。 9. **开发文档**: 开发文档通常包含了Shiro的安装指南、API参考、使用示例等内容,帮助开发者快速上手并解决实际...
Shiro源码分析将帮助我们理解其工作原理和核心组件。 首先,Shiro的设计理念可以概括为:简单易用且功能强大。Shiro具有三个核心概念:Subject、SecurityManager和Realms。 1. Subject代表了当前与软件交互的用户...
对于开发者来说,通过学习 Shiro 的源码,可以深入理解其内部工作原理,提高安全编程的能力。在这个 Shiro1.2.2 的源码包中,我们可以探索以下几个关键知识点: 1. **身份认证(Authentication)**:Shiro 提供了...
在本压缩包中,你获得了Shiro框架的核心部分——shirocore1.7的源代码,版本号为1.7.0,这将对理解Shiro的工作原理及其内部机制大有裨益。 Shiro 的核心组件主要包括以下几个方面: 1. **Authentication(认证)**...
通过阅读`shiro源码分析(pdf+word)`,你可以深入探究Shiro的内部机制,如`RememberMe`服务、会话管理器的工作流程,以及加密算法的应用等。 总的来说,Apache Shiro是一个全面且易用的Java安全框架,适合各种规模...
通过分析和运行这个"shiro代码示例 web项目",你可以更深入地理解Shiro的架构和工作原理,为自己的项目提供安全基础。同时,它也可以作为学习和研究Shiro的最佳实践案例,帮助你在实际开发中快速上手。
【Shiro反序列化漏洞原理】 Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能。在Shiro中,反序列化漏洞主要出现在RememberMe服务中,该服务允许用户在登录后一段时间内自动保持...
在"shiro_attack_2.2.zip"这个压缩包中,我们可以推测它可能包含了关于Apache Shiro的安全攻击分析或者防御策略,特别是针对其2.2版本的。下面我们将深入探讨Apache Shiro的基本概念、常见攻击以及如何防范这些攻击...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了应用安全的实现。在提到的 "shiro_attack_by J1anfen" 工具中,重点是针对 Apache Shiro 的一个特定安全问题:...
在学习Shiro时,源码分析是一个深入了解其内部工作原理的有效方式。本文将继续上一篇文章的案例,深入分析Shiro的Subject和Session机制,以及SecurityManager在创建Subject时所扮演的角色和过程。 首先,Shiro中的...
#### 三、Shiro的工作原理 Shiro的核心组件是Subject,它是应用程序和Shiro之间的桥梁。Subject代表了当前用户,它可以调用Shiro的安全服务。Subject将请求转发给SecurityManager,后者负责实际的安全处理。...
Spring是企业级应用开发的事实标准,而Shiro则是一个轻量级的安全框架,提供了身份验证、授权、会话管理和加密等功能。通过整合这两个框架,我们可以构建出高效且灵活的安全管理体系。 首先,让我们了解Spring和...
总之,"Shiro demo 例子" 是一个极好的起点,可以帮助开发者快速上手 Shiro,理解其工作原理,并将这些知识应用于实际项目中,提升应用的安全性。通过实践这个示例,初学者将能够更好地掌握 Java 应用中的安全控制。
通过分析源代码,我们可以深入理解Shiro的工作原理和设计模式。 1. **认证**: Shiro 的认证过程包括身份验证(Authentication)和登录(Login)。身份验证涉及Subject、Realm和CredentialsMatcher等核心组件。...
Apache Shiro 是一个强大且易用的...通过学习这个压缩包中的资料,你可以系统地掌握Shiro的基本用法,理解其工作原理,并能在实际项目中灵活运用。同时,也可以借此机会深入学习Java安全相关知识,提升自己的专业技能。
开发者可以解压并运行这个示例,观察其工作原理,学习如何将Shiro与Spring、SpringMVC整合。源代码中,你可能会发现SpringMVC的Controller如何调用Shiro进行认证和授权,以及如何配置Shiro的配置文件(如shiro.ini或...
5. **Shiro会话管理**:Shiro 提供了会话 API,可以跨服务器共享会话数据,支持会话超时、会话固定攻击防护等功能。在分布式系统中,Shiro 可以与 Redis 或其他缓存服务结合,实现分布式会话管理。 6. **测试与实践...