关于Apache shiro实现一个账户同一时刻只有一个人登录(shiro 单点登录)

 更新时间:2017年09月20日 10:50:56   作者:ChaplinJ  
今天和同事在一起探讨shiro如何实现一个账户同一时刻只有一session存在的问题,下面小编把核心代码分享到脚本之家平台,需要的朋友参考下

今天遇到一个项目问题,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多路复用模块(MPMs)介绍

    Apache多路复用模块(MPMs)介绍

    这篇文章主要介绍了Apache多路复用模块(MPMs)介绍,MPM,也叫多道处理模块(Multi Processing Module),关系到整个HTTP会话,本文就介绍它的相关知识,需要的朋友可以参考下
    2015-01-01
  • Linux添加swap分区的方法

    Linux添加swap分区的方法

    这篇文章主要介绍了Linux添加swap分区的方法,首先需要我们建立一个普通的linux 分区,具体实例代码,大家跟随脚本之家小编一起看看吧
    2018-08-08
  • Vim编辑器常用的命令总结

    Vim编辑器常用的命令总结

    使用 Vim 的时间不长,但如今已经离不开熟悉的 Vim 编辑模式了。 Vim 的学习曲线是非常陡的,一开始学习的时候,面对很多的操作命令要去记住,常常望而却步。其实,只要记住一些常用的命令,加之在工作中坚持使用 Vim 进行编辑,很快就能得心应手了。下面来一起看看吧。
    2017-04-04
  • Linux lseek函数的使用详解

    Linux lseek函数的使用详解

    这篇文章主要介绍了Linux lseek函数的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • CentOS 离线安装gcc(版本4.8.2)详细介绍

    CentOS 离线安装gcc(版本4.8.2)详细介绍

    这篇文章主要介绍了CentOS 离线安装gcc4.8.2详细介绍的相关资料,需要的朋友可以参考下
    2017-01-01
  • 基于linux命令提取文件夹内特定文件路径

    基于linux命令提取文件夹内特定文件路径

    这篇文章主要介绍了基于linux命令提取文件夹内特定文件路径,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Linux yum 命令安装mysql8.0的教程详解

    Linux yum 命令安装mysql8.0的教程详解

    这篇文章主要介绍了Linux yum 命令安装mysql8.0的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • linux并发连接50万的配置方法

    linux并发连接50万的配置方法

    这篇文章主要介绍了linux并发连接50万的配置方法,需要的朋友可以参考下
    2016-08-08
  • 16个简单实用的.htaccess使用技巧

    16个简单实用的.htaccess使用技巧

    这篇文章包括了16个非常有用的小技巧。另外,因为.htaccess 是一个相当强大的配置文件,所以,一个轻微的语法错误会造成你整个网站的故障,所以,在你修改或是替换原有的文件时,一定要备份旧的文件,以便出现问题的时候可以方便的恢复。
    2011-04-04
  • linux下使用 du查看某个文件或目录占用磁盘空间的大小方法

    linux下使用 du查看某个文件或目录占用磁盘空间的大小方法

    下面小编就为大家带来一篇linux下使用 du查看某个文件或目录占用磁盘空间的大小方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11

最新评论