关于Apache shiro实现一个账户同一时刻只有一个人登录(shiro 单点登录)
发布时间 - 2026-01-11 03:20:19 点击率:次今天遇到一个项目问题,shiro如何实现一个账户同一时刻只有一session存在的问题,找了几篇文章,在这里就把核心的代码理了理,具体情况如下。

1.假设你使用了Apache shrio ,项目要求一个账户同一时刻只能有一个用户存在,那么你就应该在你的shiro配置文件中添加以下代码:
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"></bean>
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg name="name" value="SHRIOSESSIONID"/>
</bean>
<!-- 配置shiro session 的一个管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionDAO" ref="sessionDAO"></property>
</bean>
<!-- 配置shiro 缓存的一个管理器 -->
<bean id="shiroCacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"></bean>
<!-- 配置 Shiro 的 SecurityManager Bean. -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- <property name="cacheManager" ref="cacheManager"/>-->
<property name="realm" ref="myRealm"/>
<!-- shiro缓存管理器 -->
<property name="cacheManager" ref="shiroCacheManager"></property>
<!-- shiro session管理器 -->
<property name="sessionManager" ref="sessionManager"></property>
</bean>
接下来你就应该在你的realm中添加下面的代码,这里主要是为了判断用户登录的账户是否已经登录过了。
@Autowired private SessionDAO sessionDAO; ...............
接下来你就应该在realm中得到shiro 的缓存中得到所有的已经登录的账户,进行判断当前用户是否已经登录
//apache shiro获取所有在线用户
Collection<Session> sessions = sessionDAO.getActiveSessions();
for(Session session:sessions){
String loginUsername = String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));//获得session中已经登录用户的名字
if(username.equals(loginUsername)){ //这里的username也就是当前登录的username
session.setTimeout(0); //这里就把session清除,
}
}
2.SessionManager
这里有个可能出现bug的地方,可以通过配置sessionIdCookie属性,解决被服务器重写cookie中会话ID
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg name="name" value="SHRIOSESSIONID"/> </bean>
完成这一切之后,本地单一用户登录就差不多完成了,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# apache
# shiro
# shiro实现单点登录
# spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染
# Java中SSM+Shiro系统登录验证码的实现方法
# Java中基于Shiro
# JWT实现微信小程序登录完整例子及实现过程
# spring boot整合Shiro实现单点登录的示例代码
# springmvc+shiro+maven 实现登录认证与权限授权管理
# shiro之记住登录信息
# Shiro 控制并发登录人数限制及登录踢出的实现代码
# shiro多验证登录代码实例及问题解决
# 管理器
# 你就
# 就把
# 用户登录
# 有一
# 在这里
# 有个
# 过了
# 在此
# 不多
# 可以通过
# 这一切
# 找了
# 具体情况
# 可能出现
# 小编
# 给我留言
# 配置文件
# 感谢大家
# 就差
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信小程序 HTTPS报错整理常见问题及解决方案
JavaScript如何操作视频_媒体API怎么控制播放
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
Laravel如何使用Livewire构建动态组件?(入门代码)
北京的网站制作公司有哪些,哪个视频网站最好?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
香港服务器如何优化才能显著提升网站加载速度?
海南网站制作公司有哪些,海口网是哪家的?
JS去除重复并统计数量的实现方法
php 三元运算符实例详细介绍
如何挑选高效建站主机与优质域名?
如何在万网利用已有域名快速建站?
Linux安全能力提升路径_长期防护思维说明【指导】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
移动端脚本框架Hammer.js
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
香港网站服务器数量如何影响SEO优化效果?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
如何在橙子建站中快速调整背景颜色?
如何在阿里云域名上完成建站全流程?
高防服务器如何保障网站安全无虞?
如何在宝塔面板中创建新站点?
Linux系统命令中tree命令详解
公司网站制作价格怎么算,公司办个官网需要多少钱?
浅述节点的创建及常见功能的实现
bootstrap日历插件datetimepicker使用方法
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
原生JS获取元素集合的子元素宽度实例
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel观察者模式如何使用_Laravel Model Observer配置
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何快速生成可下载的建站源码工具?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
昵图网官网入口 昵图网素材平台官方入口
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel如何处理CORS跨域请求?(配置示例)
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
网站制作软件有哪些,制图软件有哪些?
Python图片处理进阶教程_Pillow滤镜与图像增强
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】

