关于Apache shiro实现一个账户同一时刻只有一个人登录(shiro 单点登录)
作者:ChaplinJ 发布时间:2023-08-04 22:55:41
标签:apache,shiro,登录
今天遇到一个项目问题,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>
完成这一切之后,本地单一用户登录就差不多完成了,希望对大家有所帮助
来源:http://blog.csdn.net/wingstudio_zongheng/article/details/51111728
0
投稿
猜你喜欢
- 一、前期准备一个成功的个人网站,先期的准备工作是很重要的,好的开始等于成功的一半。在这一阶段有两个主要的问题需要考虑。1、站点的定位:主题的
- IIS服务器出错的原因是复杂的。象服务启动失败、IIS进程中断或者站点不能启动这些错误都会在系统日志中记录一个错误事件。不论IIS出现何种错
- 1. 后台执行一般运行linux上的程序都是执行 .sh 文件(./sh文件),那如果不影响当前CMD窗口的操作,需要后台运行怎么办呢?这时
- 随着六一国际儿童节的临近,越来越多的互联网从业人员开始怀念童年,更有好事者提出了九条建议。希望广大站长在闲暇之余博得一乐。以下为网友提供的九
- 开启视频功能今天,笔者详细给大家介绍一下,如何使用Discuz!6.0论坛中的视频上传和在线录制功能。站长如何开启视频功能:使用Discuz
- 核心提示:网站的存在就已经不是一个个人行为了,因为你面向的是一个广泛的群体,而非只是针对性的自己一个人,因此,网站的运营过程中,就必经有人加
- 问题提出公司的开发测试服务器部署在阿里云, 阿里云给出的实例一般都是只有一个分区, 20G到40G的样子, 然后再买存储挂载到其他目录.而
- 原来qmail系统的邮箱一天起码要收十几份垃圾、病毒邮件,实在是比较烦,不是很喜欢qmail,特别是日志,让人不知所云,所以干脆考虑更换邮件
- 精神是灵魂。国家精神是国家之“魂”,民族精神是民族之“魂”,站长精神是站长之“魂”! 何谓站长精神?&n
- 笔者虽然经过多次实践总结经验写成了Windows2003设置教程,但还是难免有错误,本篇就来说说教程中的错误之一:MSSQL运行在普通用户权
- 一、安装POP3和SMTP服务组件Windows Server 2003默认情况下是没有安装POP3和SMTP服务组件的,因此我们要手工添加
- 1. 结构体在内存中是如何存储的int main() { Student stu; stu.id = 123456; strcpy(st
- 这几天一华尔街日报专栏作家Mark Penn的一篇《美国新职业“专职博客”》赢得不少关注。这篇文章的原文在这里。我稀里糊涂博客五年,对这个话
- 详解 Linux 常用目录的作用一 常用一级目录注意:1、根目录下的bin和sbin,usr目录下的bin和sbin,这四个目录
- “百度笑了,我们哭了”这是我今天在QQ上看到的一条个性签名。一开始我觉得这句话很好笑,呵呵…不过仔细一想,还真的是有这么回事,百度在笑,各大
- 许多web浏览器都比IE更易于使用,并且不会那么容易就受到黑客和其它威胁的攻击。 大家似乎很难想起来还有许多可以替代IE的web
- V5shop网络联盟系统:网商应突破平台壁垒 盈利为王最近,一些具有忧患意识的独立网商经常通过邮件或QQ向笔者咨询,归纳一下,问题基本集中在
- 对于SNS社交网站,我们已经太熟悉了,甚至隐隐有厌倦的感觉,这个时候,要上线新的SNS社交网络,必须要有惊人之举,否则是很难吸引到新用户的。
- ■ 如何在您的程式使用 curses ?在您的 C 程式的档头将 <curses.h> include 进来.当您引进 curs
- 随着docker使用的镜像越来越多,就需要有一个保存镜像的地方,这就是仓库。目前常用的两种仓库:公共仓库和私有仓库。最方便的就是使用公共仓库