场景:
1-打开一个Tab,用Admin登录系统
2-再打开一个Tab,用User登录系统
3-退回Admin的Tab,操作数据
此时的用户已经不是Admin而是User了。
※早期主流浏览器没有选项卡,开创选项卡浏览器的是国人二次开发的MyIE。
不理解Session与Cookie的先补补这部分知识。
浏览器的多选项卡之间是共有一个Session的,所以这种情况下一般需要通过以下方法来访问系统:
1)打开不同的浏览器,比如:IE、FF、Chrome
2)打开同一浏览器的多个窗口(不是Ctrl+N打开)
IE: File>New Session
FF: File>New Private Window(Ctrl+Shift+P)
Chrome: Menu>New incognito Window(Ctrl+Shift+N)
这两种方法只能针对开发测试的,对用户来说就有些牵强了。
如何让系统支持多用户在多选项卡间同时登陆?首先最基本的需要采用ACL权限控制来保证用户的权限不会越级,比如上边这个场景不至于普通User执行了Admin的操作。
其次需要让多个选项卡之间只允许一个用户登录。
1)过滤请求,如果访问的是登录页,查看Session中是否已有用户信息,直接跳向指定页。
HttpSession session = request.getSession();
User user = (User) session.getAttribute("LOGIN_USER_INFO");
if (user == null) {
// Session Timeout
response.sendRedirect("LOGIN_URL");
return false;
} else {
// Multiple or Repeated Login
if ("LOGIN_URL".equals(request.getRequestURI())) {
response.sendRedirect("HOME_URL");
return false;
}
}
2)成功登陆后新建一个会话,删除老的会话,可防御会话劫持Session Fixation / Hijacking。
HttpSession oldSession = request.getSession(false);
if (oldSession != null && !oldSession.isNew()) {
// store the old session
Enumeration attrNames = oldSession.getAttributeNames();
Properties props = new Properties();
if (attrNames != null) {
while (attrNames.hasMoreElements()) {
String key = (String) attrNames.nextElement();
props.put(key, oldSession.getAttribute(key));
}
}
// invalidate the old session
oldSession.invalidate();
// generate a new session
HttpSession newSession = request.getSession(true);
// copy the data of the old session into the new session
attrNames = props.keys();
while (attrNames.hasMoreElements()) {
String key = (String) attrNames.nextElement();
newSession.setAttribute(key, props.get(key));
}
}
另外两个问题:
1)限制同一个用户在同一时间只能登录一次
这里说的不是SSO单点登录,而是防止一个账户多处登录
在服务器端存储一个User的会话Map<User, Session>(或存入DB)
创建一个HttpSessionListener来监听会话,如果该User的会话已经存在用新的会话替换它。
2)同一服务器多应用的会话管理
Tomcat使用JSESSIONID作为默认的Cookie键值来识别Session,也可以自定义该键值:
<Host name="localhost" appBase="webapps"...>
<Context path="/appA" sessionCookieName="yourCookieName"/>
</Host>

- 大小: 162.5 KB
分享到:
相关推荐
【Paypal Sessions Viewer--for zencart1.5】是一个专为Zen Cart 1.5电子商务平台设计的工具,主要用于查看Paypal交易过程中的会话数据。这个工具可以帮助店主更好地理解Paypal支付流程中用户的交互行为,从而进行...
log-sessions-2021-08-21-041328.session
- 通过定期浏览管理您的会话 - 活动会话没有限制 - 恢复单个标签或整个会话 - 标记你的会话 - 按会话名称,网站网址或标题进行搜索 - 导出和分享您的会话 - 用作书签管理器(关闭自动跟踪,不会保存更改) --...
Tab Sessions在用户的Omnibar旁边放置一个图标,这会在弹出窗口中打开Tab Session Manager。 用户可以从此处保存新的标签会话,并加载,更新或删除旧的标签会话。 标签会话是使用HTML5的本地存储功能存储的,因此...
django-redis-sessions, 在Redis数据库中,用于存储会话的Django 会话后端 django-redis-sessions用于你的会话的Redis数据库后端 安装工具可用设置变更日志文件安装运行 pip install django-redis-sessions 或者另外...
log-sessions-2021-09-21-183121.session
"Python库 | django_user_sessions-1.1.0-py2.py3-none-any.whl" 这个标题明确指出我们正在讨论的是一个Python库,具体是`django_user_sessions`,版本号为1.1.0。`.whl`文件是一种Python的可分发格式,用于方便安装...
在MT5中,“i-Sessions”是一款特别设计的脚本,用于显示和分析全球不同市场的交易会话,这对于全球交易者理解市场动态至关重要。 交易会话是指金融市场在特定时间段内的活跃交易时段。主要的交易会话包括亚洲、...
标题中的"Products.Sessions-4.11-py2.py3-none-any.whl"是一个Python库的发行包,这是Python生态系统中常见的分发格式。它主要用于安装和分发Python软件包,尤其是通过pip(Python的包管理器)进行安装时。这种格式...
标题中的“PyPI 官网下载 | p2.ui.sessions-0.3.3-py3-none-any.whl”指的是在Python的包索引服务(Python Package Index,简称PyPI)上发布的名为`p2.ui.sessions`的软件包的特定版本0.3.3。这个包是为Python 3编写...
`django-user-sessions-0.1.0.tar.gz`文件提供了Django用户会话管理的增强版工具,帮助开发者构建更安全、更高效的Web应用。通过集成这个库,可以更好地管理用户会话,提升应用的用户体验,同时增强了系统的安全性。...
"django-multi-sessions-0.1.0"库扩展了Django的默认会话机制,通过引入更高效的会话存储策略,使得在处理大量并发用户时,服务器可以更好地管理这些会话。具体来说,它可能包括以下特性: 1. **分布式存储**:该库...
资源来自pypi官网。 资源全名:Products.Sessions-4.11-py2.py3-none-any.whl
标题中的“PyPI 官网下载 | django-mongo-sessions-0.0.3.tar.gz”指的是Python的包管理器PyPI(Python Package Index)上发布的名为“django-mongo-sessions”的软件包,版本为0.0.3,其源代码以tar.gz格式打包提供...
资源分类:Python库 所属语言:Python 资源全名:Products.Sessions-4.5-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:Products.Sessions-4.12-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
标题中的“dj-dynamodb-sessions-0.8.4b0.tar.gz”是一个Python库的压缩包,主要用于处理Web应用程序的会话管理。这个库的独特之处在于它将会话数据存储在Amazon DynamoDB数据库中,而不是传统的文件系统或内存中。...