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 会话中存储的对象变成了字符串?

    通常我不会在 Rails 会话中存储对象 但我正在使用需要此功能的库 我遇到了一个非常奇怪的问题 其中存储的对象在重定向后显示为字符串 为了重现 我创建了一个示例 Rails 4 1 应用程序 rails new session test
  • 在 ASP.NET MVC ViewModel 中存储模型 ID,安全问题

    在我的 MVC 应用程序中 我有一个页面供用户编辑其帐户详细信息 例如电子邮件地址 密码等 在我的数据库中 用户表保存此数据 主键是 UserId 在我创建的 ChangeAccountDetails 视图上 我传递了一个 ViewMode
  • Symfony2:检查会话是否存在

    有没有办法检查会话是否存在 我尝试过这种方法 但它总是给我一个 太棒了 回答 session this gt getRequest gt hasPreviousSession if session return new Response B
  • 强制用户注销会话 PHP

    我似乎无法找到这个问题的直接答案 有没有办法强制登录用户注销 我的登录系统本质上只依赖于包含用户唯一 ID 存储在 mysql 数据库中 的会话 所以本质上只是 if isset SESSION user id echo You re lo
  • 使用Rvest登录网站抓取时出现403错误

    我试图在需要登录的网站上抓取页面 但不断收到 403 错误 我已经修改了我网站的这两篇文章中的代码 使用rvest或httr登录网页上的非标准表单 https stackoverflow com questions 28418770 usi
  • 使用 Spring 处理会话 ID

    我正在尝试为 GWT 构建一个 Spring 服务器 您可以将其视为 Javascript AJAX 客户端 但我无法决定架构的某一点 Session应该如何创建和使用 显然最简单的方法是使用 HTTP 会话 cookie 等 看起来不错
  • 如何为多处理池中的单个进程分配Python请求会话?

    考虑以下代码示例 import multiprocessing import requests session requests Session data to be processed def process arg do stuff w
  • 使用 Django 会话存储登录用户

    我正在创建一个以 REST 为中心的应用程序 它将针对大多数特定于域的模型使用某种 NoSQL 数据存储 对于我打算围绕 REST 数据框架构建的主站点 我仍然希望对用户 计费信息和域数据模型范围之外的其他元数据使用传统的关系数据库 有人告
  • 如何使用 Spring Security 和 Spring Session 从多个服务器获取相同的会话

    很抱歉我的英语还是不太好 请耐心等待 希望您能理解我的问题 我有两个网络服务器 每个网络应用程序都是相同的 Web 服务器共享一台 Redis 服务器 我使用 Spring Security 和 Spring Session 当我登录第一台
  • 检查用户是否登录ajax页面更改

    作为我正在构建的网络应用程序的一部分 我需要在用户更改页面时检查用户是否已登录 在普通的非ajax站点上 这很容易 因为我可以将PHP会话条件语句放在标头中 并且在每次页面更改时调用的标头将确定是否显示登录页面 但将其视为头文件仅在 aja
  • 如何让用户会话持续24小时?

    我搞乱了我的 apache 和 php ini 文件 我的网站的用户仍然抱怨网站在很短的时间后或每次关闭并打开同一个浏览器时都会将他们注销 我正在运行 Apache 和 PHP 我应该进行哪些设置才能使用户会话持续 24 小时 这样他们就不
  • 如何检查 servlet 中的 sessionId 是否有效 (java)

    我在我的 Web 应用程序中维护 sessionid 和 HttpSession 对象的映射 我使用 HttpSessionListener 从地图中填充或删除会话 当我的网络服务器崩溃 宕机并恢复时 我需要一种方法来检查提交的 sessi
  • Rails 3 session_store 域 :all 的作用是什么?

    更新了问题以使其更清楚 据我所知 您可以设置 session store 的域以在子域之间共享会话 如下所示 Rails application config session store cookie store key gt my key
  • 将 List 保存到 ASP.NET 中的会话

    购物车项目保存在 SQL 数据库中 我想将所有 CartItems 放在一个 List 中并转移到 Instance Items The Instance变量正在保存到会话中 代码如下 public class ShoppingCart p
  • NodeJS + Express + Mongo 会话存储

    我目前在尝试在 MongoDb 中存储会话时遇到了很大的麻烦 我尝试过express session mongo和connect mongodb 当我尝试加载登录页面时 两者都给出了相同的 500内部服务器错误 这让我觉得也许在某个地方与
  • Shiro 与 SpringSecurity [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我目前正在评估基于Java的安全框架 我是Spring 3 0用户 因此SpringSecurity似乎是正确的选择 但Spring安全性似乎过
  • 如何将 PHP 会话数据保存到数据库而不是文件系统中?

    我有两个网站 一个是 TLS 一个不是 两个都适用于同一个客户端 但我需要这些网站彼此 并且仅彼此 共享通用数据users orders accounts etc 这通常可以通过以下方式完成 SESSION数据 但我显然这些不能跨其他站点工
  • 使用 CDI+JSF 使会话失效不起作用

    我正在尝试在我的应用程序中实现注销 所以我这样做了 public String logout try FacesContext facesContext FacesContext getCurrentInstance ExternalCon
  • 如何在 C# 中将 cookie 过期设置为“会话”?

    不言自明 在 PHP 中 解决方案是将 cookie 过期设置为 0 我不确定 C 因为它需要 DateTime 值 的文档Cookie 过期 http msdn microsoft com en us library system net
  • PassportJS - 自定义回调并将 Session 设置为 false

    是否可以使用自定义回调并禁用会话 在文档中 它显示了如何禁用会话和自定义回调 但如何组合它们 app get login function req res next passport authenticate local function

随机推荐

  • 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