关于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温度【技巧】