`
ahua186186
  • 浏览: 554744 次
  • 性别: 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会话共享实战

    2、环境搭建 ①配置java7、gradle2.2.1、redis3.0.4环境; ②在java代码中配置org.demo.shiro.rediscache.RedisClient.redisServerIp

    Shiro原理+配置

    SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。 Realm: Realm充当了Shiro与应用安全数据间的"桥梁"或者"连接器"。也...

    shiro 内存模型分析

    shiro 内存模型分析

    Shiro 视频教程+源码+课件

    内容涵盖 Shiro 认证、加密、授权、安全标签、安全注解、会话管理、缓存、Rememberme 等 JavaEE 企业级开发的核心技术。视频讲授过程中通过分析源代码使学员知其然更知其所以然。 【课程内容】 第一章 问候 Shiro ...

    shiro的session中的会话管理

    在分布式系统或者微服务架构下,都是通过统一的认证中心进行用户认证。如果使用默认会话管理,用户信息只会 保存到一台服务器上。那么其他服务就需要进行会话的同步。 即session中的会话管理

    SSM+shiro+redis

    spring+springmvc+mybatis+shiro+redis集成项目,rdis作为并发缓存工具,shiro权限管理,实现单点登录,同一个用户会别踢下线

    shiro+cas单点登录技术分析

    分析shiro框架+cas单点登录系统的技术分析,解析了相关的技术难点

    尚硅谷Shiro视频教程

    · 00.尚硅谷_Shiro_源码、课件 · 01....尚硅谷_Shiro_会话管理 · 24. 尚硅谷_Shiro_SessionDao · 25.尚硅谷_Shiro_缓存 · 26.尚硅谷_Shiro_认证和记住我的区别 · 27.尚硅谷_Shiro_实现Rememberme

    Shiro 身份验证、授权、密码和会话管理

    使用Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序

    shiro会话管理示例代码

    Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),直接使用Shiro的会话管理可以直接替换如Web容器的会话管理

    shiro 1.4.1.rar

    Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多...Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。这不就是我们想要的嘛,而且 Shiro 的 API 也是非常简单.

    Shiro框架三部曲

    Shiro是Apache从JSecret项目演变而来的,该框架实现了:用户登录、认证、授权和权限管理操作的完整控制流程。Shiro最早的名字是JSecurity,后来...用于简洁地处理身份验证,授权,企业多个系统会话管理,加密服务等。

    shiro-core-1.7.1 jar

    shiro shiro-core-1.7.1 jar shiro漏洞

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

    shiro-redisson 是一个 Apache Shiro 的扩展组件,提供了基于 redis 实现的缓存和会话,以支持分布式环境下的应用。底层使用了 redisson 作为 redis 客户端。

    Shiro入门教程

    Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。 Shiro可以在任何环境下运行,小到最简单的命令行应用,大到大型的企业应用以及集群应用。但是我们准备在快速指南中使用最最简单的main...

    shiro资料shiro资料

    shiro入门 安全校验

    Shiro反序列化漏洞,Shiro版本升级资源

    shiro使用的版本是1.2.4,存在反序列化漏洞,我们采取的办法是手动升级到了1.2.6版本,但苦于无法验证是否解决了问题,后来发现了一款测试工具,ShiroExploit。 测试工具下载地址 ... 反序列化漏洞是如何产生的?...

    angular-shiro, 身份验证,授权和会话管理.zip

    angular-shiro, 身份验证,授权和会话管理 角 shiroangular-shiro 是试图将 Apache引入到 AngularJS世界中。什么事?angular-shiro 是从这样简单的需求中产生如果用户不是管理员管理员,那么这个按钮必须是不可用的...

    shiro(shiro-all-1.8.0.jar)

    shiro(shiro-all-1.8.0.jar)

Global site tag (gtag.js) - Google Analytics