Shiro中Session和Cache

news/2024/6/29 12:17:55 标签: Shiro, Session, Cache

Session是一种状态保持机制,参考文章Session是什么可知Session和Web服务也没有必然关系,Shiro本身的Security Manager也可以脱离Servlet自己管理Session

根据Security Manager不同 Shiro本身有3种Session管理机制

Session Manager所需Security ManagerSession周期
DefaultSessionManagerDefaultSecurityManager使用的默认实现,用于 JavaSE 环境;
ServletContainerSessionManagerDefaultWebSecurityManager使用的默认实现,用于 Web 环境,其直接使用 Servlet 容器的会话
DefaultWebSessionManagerDefaultWebSecurityManager用于 Web 环境的实现,可以替代 ServletContainerSessionManager,自己维护着会话,直接废弃了 Servlet 容器的会话管理

可以配置在 securityManager 的 sessionManager 属性中

1
2
3
4
5
6
7
8
9
10
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realm" ref="sampleRealm"/>
    <property name="cacheManager" ref="cacheManager"/>      <====进行Cache机制的配置
    <property name="sessionManager" ref="sessionManager"/>  <====进行Session机制的配置
</bean>

// 不同的Session机制需要不同的配置属性
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    .......
</bean>

Cache-缓存" style="margin-left:0px;">Cache 缓存

Cache的作用是把每次通过Realm查询到的结果存入Session,以便用户访问时加快Authentication和Authorization

如果要使用cache,必须在 securityManager 和 sessionManager 中同时进行配置

sessionManager的配置

在上文的例子中我们使用了最复杂的 org.apache.shiro.web.session.mgt.DefaultWebSessionManager 此处来讲解如何进行具体配置

准备工作

首先我们先对sessionManager里会用到的属性进行控制反转,加入Spring,至于为什么需要这些属性,参考文章Session是什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//shiro自带的EhCache缓存
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"/>

//用来产生不重复的sessionId
<bean id="sessionGenerate" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>

//session类本身,最主要的存放有sessionId
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
    <property name="sessionIdGenerator" ref="sessionGenerate"/>
</bean>

//因为放弃了容器的Session机制,所以要自己完成和Web的Cookie交换
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    <property name="httpOnly" value="true"/>
    <property name="maxAge" value="1800000"/>
    <property name="name" value="shiroKey"/>
</bean>

//对Session进行验证的类
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
    <property name="interval" value="1800000"/>
    <property name="sessionManager" ref="sessionManager"/>
</bean>

注入sessionManager

在准备好了属性之后,对sessionManager进行注入

1
2
3
4
5
6
7
8
9
10
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    <property name="sessionDAO" ref="sessionDAO"/>  <====放入具体实例化的Session的Object
    <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <====采用此类进行Session的验证
    <property name="sessionValidationSchedulerEnabled" value="true"/> <====开放Session验证
    <property name="sessionIdCookie" ref="sessionIdCookie"/> <====采用该Cookie机制
    <property name="sessionIdCookieEnabled" value="true"/> <====开放Cookie机制
    <property name="deleteInvalidSessions" value="true"/> <====删除失效的Session
    <property name="cacheManager" ref="cacheManager"/> <====采用自定义缓存
    <property name="globalSessionTimeout" value="1800000"/> <=====Session多久失效
</bean>

Shiro配置完毕" style="margin-left:0px;">Shiro配置完毕

虽然讲解了自定义的DefaultWebSessionManager但是为了不产生额外的负担推荐使用ServletContainerSessionManager服务器容器自身的Session机制

因为在使用DefaultWebSessionManager产生过一些逻辑意外页面刷新就自动登出了Shiro

此时Shiro虽然已经配置完毕,按照道理应该可以正常使用,但是在实际过程中不会存放明文密码,所以请在阅读了Shiro完成加盐登陆后再进行实战


http://www.niftyadmin.cn/n/1870460.html

相关文章

Apache Shiro去掉URL中的JSESSIONID

最近集成框架用到shiro碰到url有时候会带上jsessionid有时候又没有。以前也碰到但是没有深入研究。网上查了半天各种方法用了都没用。比如web.xml里面加session-config,添加DisableUrlSessionFilter 等等神马都没用。于是自己研究源码。说了半天废话终于进入正题。先申明下我是…

缓存框架EhCache整合shiro权限验证(基于spring整合)

缓存简介&#xff1a; 缓存可以提高查询数据性能&#xff0c;对同一批数据进行多次查询时&#xff0c; 第一次查询走数据库&#xff0c;查询数据后&#xff0c;将数据保存在内存中&#xff0c; 第二次以后查询可以直接从内存获取数据&#xff0c;而不需要和数据库进行交互。 …

算法技能树--蓝桥杯基础-猜年龄

目录1、先看题目2、先上代码1、先看题目 猜年龄 美国数学家维纳(N.Wiener)智力早熟&#xff0c;11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次&#xff0c;他参加某个重要会议&#xff0c;年轻的脸孔引人注目。于是有人询问他的年龄&#xff0c;他回答说&…

shiro使用ehcache实现集群同步和session复制

一般情况下WEB应用集群的会话复制都是通过容器实现的&#xff0c;shiro权限框架中可以定义SessionDAO直接将session持久化到缓存中&#xff0c;这样只需要对缓存做集群就可以代替session的复制。 实现思路 1、用SessionDAO将session保存到ehcache缓存 2、配置ehcache的jgrou…

spring+shiro多节点session共享

shiro我就不多介绍了&#xff0c;我的方案是重写 shiro的sessionDAO,把session存储到redis上&#xff0c;直接上代码 一、spring中配置 <bean id"securityManager" class"org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- <proper…

算法技能树2-蓝桥杯-python实现测试次数(摔手机)-动态规划(DP)

文章目录1、题目描述2、python解题1、知识点总结1、题目描述 x星球的居民脾气不太好&#xff0c;但好在他们生气的时候唯一的异常举动是&#xff1a;摔手机。 各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试&#xff0c;并且评定出一个耐摔指数…

遇到问题----shrio------shiro登录,多个项目session被覆盖问题---两个web项目会导致shiro的session污染

情况 遇到问题----shrio------shiro登录&#xff0c;多个项目session被覆盖问题---一个项目两个web模块会导致shiro的session污染 表现为 我在同一台机子上部署了两个都使用了shiro管理的web项目。 它们的访问路径除了端口不一样&#xff0c;ip是一样的。 当两个系统同时访…

shiro-session-ehcache配置

首先准备好jar包 shiro的主要四个&#xff1a; ehcache: shiro.xml 配置 首先securityManager配置 sessionManager配置&#xff1a; <bean id"sessionManager" class"org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><property…