Shiro中Session和Cache

2023-11-15

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

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

Session Manager 所需Security Manager Session周期
DefaultSessionManager DefaultSecurityManager 使用的默认实现,用于 JavaSE 环境;
ServletContainerSessionManager DefaultWebSecurityManager 使用的默认实现,用于 Web 环境,其直接使用 Servlet 容器的会话
DefaultWebSessionManager DefaultWebSecurityManager 用于 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 缓存

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配置完毕

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiro中Session和Cache 的相关文章

  • Rails 中的会话、子域和 authlogic 问题

    我有一个带有 authlogic 身份验证的 Rails 应用程序和一个使用 subdomain fu 构建的 username domain com 结构 但是当从domain com转到username domain com时 我的会话
  • 会话销毁后如何使 viewscoped beans/viewmap 生存(使用客户端保存)?

    我在用着Myfaces 2 2 具有客户端状态保存功能 我看到 ViewScoped beans 和存储在 viewmap 中的数据在用户会话销毁后丢失 我开始知道 不确定这是否正确 这是预期的行为 但是在会话销毁后避免查看过期异常的方法是
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • ASP.net,将对象添加到会话变量

    我正在尝试跨回发将对象添加到会话变量中 我的代码类似于以下内容 Supply sup Supplies GetSupply supplyItemID Session CartObjects sup 现在 编译器会抛出一个错误 指出 运算符不
  • 在带有 RequestScope 的 ManagedBean 中使用有状态 EJB 时出现问题

    我在 Glassfish v3 应用程序服务器中使用 JSF 2 0 和 EJB 3 1 我实际上面临以下问题 在带有 RequestScope 的 MengedBean 中 我想访问一个会话对象 带有 Stateful 的 EJB 它应该
  • PHP:会话.auto_start

    我在同一台服务器上有两个项目 它们的设置在 session auto start 中冲突 相关post https stackoverflow com questions 1378324 php setting variables in i
  • 设计对多个并发会话的支持

    我使用 Rails 3 2 11 和 Devise 2 2 3 作为订阅服务应用程序 我从另一位不再可用的开发人员那里继承了该应用程序 我是 Rails 和 Devise 的新手 我想要允许单个用户 电子邮件 拥有多个会话到同一个应用程序
  • 无法使用 ASP.NET 会话状态提供程序连接到 Redis 服务器

    一段时间以来 我一直在尝试用 Redis 替换 ASP NET Session 多个小时与适用于 Redis 的 Microsoft ASP NET 会话状态提供程序 http blogs msdn com b webdev archive
  • 如何使用 C# 上传文件并将其保存到 Stream 以便进一步预览?

    有没有办法上传文件 将其保存到流中 该流我会将其临时保存在会话中 最后 我将尝试预览此会话中的此上传文件 例如 pdf 文件 Thanks EDITED 这就是我想做的 HttpPostedFileBase hpf Request File
  • 会话在选项卡之间共享

    我有 JAVA Web 应用程序 我需要停止在浏览器选项卡之间共享会话 这意味着 用户打开浏览器 登录其帐户并在同一浏览器的新选项卡中打开特定页面 根据默认设置 会话将共享到新选项卡 并且用户会自动登录到新选项卡 谁能告诉我如何阻止这种情况
  • 从自定义设置会话文件夹中删除旧会话文件?

    使用 PHP 如果我设置自定义会话文件夹来存储会话文件 我必须做什么才能确保旧会话文件最终被删除 有没有办法让 Apache 或 PHP 为我处理这个问题 或者我需要设置一些东西来自己清理这个文件夹 非常感谢有关此主题的任何信息 我目前正在
  • XmlHttpRequest CORS POST 发送时不带 cookie

    我有一个 Rails 服务为我的 AngularJS 前端应用程序返回数据 该服务配置为通过返回足够的标头来允许 CORS 请求 当我发出 GET 请求来接收数据时 会发送 CORS 标头 以及我之前在登录时收到的会话 cookie 您可以
  • 每次使用会话来获取/设置对象属性

    我尝试搜索这个 但我什至不知道如何用它来搜索 我试图做的是有一个类 每次我访问它来更改它时 我实际上都是从会话中获取和设置值 这是我正在尝试做的事情 到目前为止我所做的事情 public class example public int p
  • Symfony2 功能测试会话持久性

    我正在尝试在 Symfony 中进行一些功能测试 但目前我的会话遇到了问题 我执行了一段代码 它似乎有效 但容器的会话中没有存储任何内容 我有一个表格 您可以在其中设置数据 当您提交它时 它会检查值并将其存储在会话中 然后它重定向到另一个页
  • 如何终止会话或会话 ID (ASP.NET/C#)

    当用户单击注销按钮时 如何销毁会话 会话 名称 我正在 MSDN 上查看 ASP NET API Reference 它似乎没有太多信息 看来还是比较有限的 但我找不到 ASP NET 类等的任何其他页面 我努力了 Session Aban
  • 使用会话 php 创建 cookie?

    我使用会话来登录我网站中的用户 问题是 我想让用户remember密码 因此关闭 打开浏览器后他们不需要再次登录 我需要使用 cookie 和 session 来实现它吗 my code user POST user pass POST p
  • Redis 会话序列化器 3.2 和 4.2 之间不匹配

    我有一个基于 Spring Cloud 的应用程序在多个 spring boot 服务器上运行 所有服务器使用 EnableRedisHttpSession共享相同的Spring Session 我现在想将第三方小部件集成到我的应用程序中
  • 在 iFrame 内维护会话状态

    不确定我是否疯了 但我在 iFrame 内的会话状态遇到问题 它是一个域在另一个域中的简单设置 我不需要跨域共享任何内容 我想做的就是将一个网站嵌入到另一个网站中 并且我希望该嵌入网站能够使用 cookie 会话状态登录 编辑 更新 等 为
  • Joomla getUser() 不显示更新的用户数据

    下面的代码允许我在用户的 Joomla 个人资料的个人资料页面中显示用户名 鉴于我已经覆盖了模板以获得我想要的外观和感觉 user JFactory getUser if user gt guest echo You are logged
  • IIS / .Net 只允许对给定用户会话进行单个并发响应

    这是我的问题 我们有一个 Net 4 5 Web 表单应用程序 由于服务器端的大量数据访问和操作 应用程序中的某些页面需要很长时间才能加载 如果用户在页面完成加载之前关闭浏览器选项卡 然后打开新选项卡 则新选项卡中对应用程序的任何请求都将挂

随机推荐

  • break和continue跳出多重循环

    关于break和continue 众所周知 break是跳出当前循环 continue是跳出本次循环 但是在多重循环中 我们可能会模糊概念 break是跳出全部循环还是只是某层循环 gt 跳出的是break所在层的循环即当前循环 结论 只要
  • VueUse中文文档Vue官方工具库

    VueUse官网地址https vueuse org 这里就列举常用工具详情请去官网 查看所有API 浏览器 useFullscreen全屏展示 isFullscreen 当前是否是全屏 toggle 是函数直接调用即可 const isF
  • Visual Studio 2022 创建C++项目

    打开Visual Studio 创建新项目 选择平台 选择空项目 点击下一步 设置项目名称以及指定项目文件位置 点击创建 创建成功后 如下图 在源文件中添加代码文件 写入代码 运行代码 F5 运行结果界面如下图所示
  • c语言模板类,C++类模板(Class Template)

    C 除了支持函数模板 还支持类模板 Class Template 函数模板中定义的类型参数可以用在函数声明和函数定义中 类模板中定义的类型参数可以用在类声明和类实现中 类模板的目的同样是将数据的类型参数化 声明类模板的语法为 templat
  • 深度学习论文精读[9]:PSPNet

    场景解析 scene parsing 是语义分割的一个重要应用方向 区别于一般的语义分割任务 场景解析需要在复杂的自然图像场景下对更庞大的物体类别的每一个像素进行分类 场景解析在自动驾驶和机器人感知等方向应用广泛 但由于自然场景的复杂性 语
  • 在Windows 10上安装TensorFlow及PyCharm开发环境

    有时候在查看官方文档时 常常看到很多的分支 所以作为开发者我们都喜欢把最佳实践总结出来 下面一起来看看如何在Windows 10上安装一个TensorFlow和PyCharm开发环境 安装Anaconda 安装Anaconda以后 即可获得
  • Image Super-Resolution Using Very Deep Residual Channel Attention Networks

    因为我是语义分割方向 对图像超分辨率不了解 这里简单记录一下读论文的收获 论文地址 超分辨率的输入是低分辨率 最终恢复超分辨率图片 作者发现低分辨率的图片拥有丰富的低频细节 对应图像中大块的平坦区域 然而低分辨率的每个通道在处理时候总是平等
  • depot_tools安装过程

    depot tools安装过程 使用torserviseSVN 1 6 6版本 移除其它版本 Install the depot tools Chromium and Chromium OS use a package of scripts
  • 数据结构——线性表(C++)

    一 前言 数据结构在逻辑结构上分为线性和非线性 例如链表 顺序表 串 数组都是线性的 他们的特点就是一对一 而非线性结构比如图和二叉树 他们的对应关系是一对多 多对多 这里介绍线性表的顺序表和链表 循环链表和双向链表 还有双向循环链表 链表
  • 关于springboot profiles

    在项目中会遇到项目环境变量切换到的问题 但是主要配置相同 只想切换部分的配置 可以在application yml配置所有的环境变量 然后在application dev yml配置dev中的环境变量 如果dev中没有配置会读取applic
  • tan x x的matlab求解,matlab画x=tan(x)

    matlab怎么解非线性方程 如tan x 4x x 2 4 equ sym tan x 4 x x 2 4 x solve equ gt gt xx 0再问 这只能求出一个解啊再答 还有其他解吗 matlab 求解tan x x 1 0
  • Rotated_Faster_Rcnn

    rotated faster rcnn 文章目录 训练 rpn head forward train rpn head forward rpn head loss rpn head get bboxes roi head forward t
  • mysql绿色版安装与卸载

    第一步 下载Mysql 官网下载地址 https dev mysql com downloads mysql 1 鼠标滑下来 找到Other Download中的 Windows x86 64 bit ZIP Archive 点击其右边的D
  • 第32步 机器学习分类实战:SHAP

    继续填坑 这回到SHAP 这个是选修 有兴趣可以看看 我们建立了十个ML模型 如果选出了Xgboost LightGBM Catboost这种树模型 大概率也是这些最厉害了 那就可以用SHAP进行模型可视化 1 首先 使用pip insta
  • 解决“The debugger has set two breakpoints at the same address 0x08xxxxx”问题

    今天来分享一个前段时间做项目适合遇到的一个bug 正好今天有空就拿出来跟大家分享一下 错误 首先 大家直接来看这个错误提示 这个错误是我在使用J Link调试时候出现的 上面的意思是 调试器在同一地址设置了两个断点 但是我检查了整个工程也没
  • 数据结构编程回顾(五)交通咨询系统设计

    题目五 交通咨询系统设计 设计要求 设计一个咨询交通系统 能让旅客咨询从任一个 城市到另一个城市之间的最短路径 里程 最低费用或者 最少时间等问题 对于不同的咨询要求 可以输入城市间路 程 所需时间或者所需费用 设计分3 个部分 1 建立交
  • QT connect第五个参数

    一 介绍 1 Qt AutoConnection 默认连接 连接类型在信号发出时确定 如果接收者和发送者在同一个线程 使用Qt DirectConnection类型 如果接收者和发送者不在一个线程 则使用Qt QueuedConnectio
  • 管理概论笔记

    前言 本文章属于在听课时做的笔记 第一周 管理导论 来源 管理概论 浙江大学 邢以群 MOOC 学习理论的目的是为了能够做没有学过的人做不了的事情或者比他们做得更好 一 管理及其功能 介绍什么是管理以及为什么需要管理 观念决定行为 行为决定
  • GBDT的正则化及与XGBOOST区别

    1 GBDT的正则化 和Adaboost一样 我们也需要对GBDT进行正则化 防止过拟合 GBDT的正则化主要有三种方式 第一种是和Adaboost类似的正则化项 即步长 learning rate 定义为 对于前面的弱学习器的迭代 fk
  • Shiro中Session和Cache

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