专栏首页后端开发随笔细说shiro之六:session管理

细说shiro之六:session管理

官网:https://shiro.apache.org/

我们先来看一下shiro中关于Session和Session Manager的类图。

如上图所示,shiro自己定义了一个新的Session接口,用于统一操作接口,并通过SessionManager实现Session管理。 其中的3个实现类HttpServletSession,SimpleSession和StoppingAwareProxiedSession是我们经常需要打交道的。

HttpServletSession

首先,我们来看看org.apache.shiro.web.session.HttpServletSession的实现。

public HttpServletSession(HttpSession httpSession, String host) {
    if (httpSession == null) {
        String msg = "HttpSession constructor argument cannot be null.";
        throw new IllegalArgumentException(msg);
    }
    if (httpSession instanceof ShiroHttpSession) {
        String msg = "HttpSession constructor argument cannot be an instance of ShiroHttpSession.  This " +
                "is enforced to prevent circular dependencies and infinite loops.";
        throw new IllegalArgumentException(msg);
    }
    this.httpSession = httpSession;
    if (StringUtils.hasText(host)) {
        setHost(host);
    }
}

显然,HttpServletSession只是简单对javax.servlet.http.HttpSession进行了封装,即: 在Web应用程序中,所有对Session相关的操作最终都是对javax.servlet.http.HttpSession进行的。

通过对上述Subject.login()的时序图分析可以知道: 在Web应用程序中,Shiro确实是通过ServletContainerSessionManager获取到容器创建的HttpSession再封装为HttpServletSession的。 也就是说,Subject.login()登录成功后用户的认证信息实际上是保存在HttpSession中的。如果此时Web应用程序部署了多实例,必须要进行Session同步。 我们知道,SecurityManager是整个Shiro框架的核心控制器,在SpringMVC中集成Shiro时,就需要明确配置对应的SecurityManager。

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <!-- Single realm app.  If you have multiple realms, use the 'realms' property instead. -->
    <property name="realm" ref="myRealm" />
</bean>

而在org.apache.shiro.web.mgt.DefaultWebSecurityManager的实现中,使用的SessionManager就是ServletContainerSessionManager。

public DefaultWebSecurityManager() {
    super();
    ((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());
    this.sessionMode = HTTP_SESSION_MODE;
    setSubjectFactory(new DefaultWebSubjectFactory());
    setRememberMeManager(new CookieRememberMeManager());
    setSessionManager(new ServletContainerSessionManager()); // 配置Session Manager
}

SimpleSession

shiro具备完善的Session管理机制,当在命令行程序中使用Shiro框架时,同样可以执行与Web应用程序一样的Session操作。 此时,Shiro实际上使用SimpleSession实现。

StoppingAwareProxiedSession

实际上,StoppingAwareProxiedSession仅仅是一个Session包装类,即: 无论是HttpServletSession还是SimpleSession,在执行Subject.login()时保存到Subject中的Session都是StoppingAwareProxiedSession对象。

private class StoppingAwareProxiedSession extends ProxiedSession {

    private final DelegatingSubject owner;

    private StoppingAwareProxiedSession(Session target, DelegatingSubject owningSubject) {
        super(target);
        owner = owningSubject;
    }

    public void stop() throws InvalidSessionException {
        super.stop();
        owner.sessionStopped();
    }
}

【参考】 https://shiro.apache.org/session-management.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在Java中调用Python

    在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。...

    2Simple
  • 细说shiro之五:在spring框架中集成shiro

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。 在此,以使用log4j为日志实现为例:

    2Simple
  • 细说shiro之四:在web应用中使用shiro

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。 而且,由于shiro-web组件使用apac...

    2Simple
  • WPF 跨线程 UI 的方法

    本文告诉大家如何在 WPF 使用多线程的 UI 的方法 在很多的时候都是使用单线程的 UI 但是有时候需要做到一个线程完全处理一个耗时的界面就需要将这个线程作为...

    林德熙
  • JavaScript之DOM的理解学习归纳

    DOM是一个针对HTML和XML文档的一个API,主要描绘了一个层次化的节点树 1、Node类型。JavaScript中所有的节点类型都继承自Node类型,因此...

    用户1148399
  • OpenLayers3基础教程——OL3 介绍control

    相比较Ol2的control,OL3显得特别少,下图分别为Ol2和Ol3的control:

    lzugis
  • 一个小实验看清Linux内核调度机制

    接着会调用schedule_idle(),然后自愿调用__schedule(false),让调度器挑出

    jeff xie
  • React Native之轻量级存储AsyncStorage

    AsyncStorage是一个简单的、异步的、持久化的以键值对形式进行数据存储的存储系统,对于App来说是全局性的。它的作用等价于iOS的NSUserDefal...

    xiangzhihong
  • 点图层叠加与事件响应

    用过百度地图的童鞋一定很羡慕百度地图POi的展示,地图切片+事件响应,以前一直在考虑这个问题,今天,将我的思考结果做一个汇报给大家。下面,将我的实现思路说明一下...

    lzugis
  • 移动端打印输出内容以及网络请求-vconsole.js

    今天,无意间从别人那里得知一个很好的js插件--vconsole.min.js,可以实现在移动端打印输出内容以及查看网络请求。下面记录使用方式。 1、下载vco...

    用户1174387

扫码关注云+社区

领取腾讯云代金券