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

今天和同事在一起探讨shiro如何实现一个账户同一时刻只有一session存在的问题,下面小编把核心代码分享到IIS7站长之家平台,需要的朋友参考下
今天遇到一个项目问题,shiro如何实现一个账户同一时刻只有一session存在的问题,找了几篇文章,在这里就把核心的代码理了理,具体情况如下。

1.假设你使用了Apache shrio ,项目要求一个账户同一时刻只能有一个用户存在,那么你就应该在你的shiro配置文件中添加以下代码:


接下来你就应该在你的realm中添加下面的代码,这里主要是为了判断用户登录的账户是否已经登录过了。

@Autowired private SessionDAO sessionDAO; …
接下来你就应该在realm中得到shiro 的缓存中得到所有的已经登录的账户,进行判断当前用户是否已经登录

//apache shiro获取所有在线用户 Collection 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.SessionManagerVPS云主机

这里有个可能出现bug的地方,可以通过配置sessionIdCookie属性,解决被服务器重写cookie中会话ID

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里给出一个使用 Flask 框架和 session 实现的简登陆页面的示例代码: ```python from flask import Flask, render_template, request, redirect, url_for, session app = Flask(__name__) app.secret_key = 'my-secret-key' # 设置 session 密钥 # 模拟用户数据 users = { 'user1': 'password1', 'user2': 'password2', 'user3': 'password3' } @app.route('/') def index(): if 'username' in session: # 如果用户已经登录,跳转到欢迎页面 return redirect(url_for('welcome')) else: return render_template('login.html') # 否则展示登陆页面 @app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] if username in users and users[username] == password: # 验证用户信息是否正确 session['username'] = username # 将用户名存入 session return redirect(url_for('welcome')) else: return render_template('login.html', error='用户名或密码错误!') @app.route('/welcome') def welcome(): if 'username' in session: # 如果用户已经登录,展示欢迎页面 return render_template('welcome.html', username=session['username']) else: return redirect(url_for('index')) # 否则跳转到登陆页面 @app.route('/logout') def logout(): session.pop('username', None) # 删除 session 中的用户名 return redirect(url_for('index')) if __name__ == '__main__': app.run(debug=True) ``` 上述代码中,我们首先通过 `app.secret_key` 设置 session 密钥。然后定义了一个 `users` 字典模拟了用户数据。在主页面 `/` 中,如果用户已经登录,就直接跳转到欢迎页面;否则展示登陆页面。在 `/login` 路由中,我们通过 `request.form` 获取用户提交的登陆信息,并验证用户名和密码是否正确。如果正确,将用户名存入 session,并跳转到欢迎页面;否则在登陆页面展示错误提示信息。在 `/welcome` 路由中,如果用户已经登录,就展示欢迎页面,否则跳转到登陆页面。最后,在 `/logout` 路由中,我们通过 `session.pop` 删除 session 中的用户名,并跳转到登陆页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值