`
rensanning
  • 浏览: 3570528 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38609
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:609125
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:684596
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:90623
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:403265
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69996
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:92367
社区版块
存档分类
最新评论

会话互串Sessions mixed-up

 
阅读更多
场景:
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

    【Paypal Sessions Viewer--for zencart1.5】是一个专为Zen Cart 1.5电子商务平台设计的工具,主要用于查看Paypal交易过程中的会话数据。这个工具可以帮助店主更好地理解Paypal支付流程中用户的交互行为,从而进行...

    log-sessions-2021-08-21-041328.session

    log-sessions-2021-08-21-041328.session

    智能会话「Smart Sessions」-crx插件

    - 通过定期浏览管理您的会话 - 活动会话没有限制 - 恢复单个标签或整个会话 - 标记你的会话 - 按会话名称,网站网址或标题进行搜索 - 导出和分享您的会话 - 用作书签管理器(关闭自动跟踪,不会保存更改) --...

    标签会话「Tab Sessions」-crx插件

    Tab Sessions在用户的Omnibar旁边放置一个图标,这会在弹出窗口中打开Tab Session Manager。 用户可以从此处保存新的标签会话,并加载,更新或删除旧的标签会话。 标签会话是使用HTML5的本地存储功能存储的,因此...

    django-redis-sessions, 在Redis数据库中,用于存储会话的Django 会话后端.zip

    django-redis-sessions, 在Redis数据库中,用于存储会话的Django 会话后端 django-redis-sessions用于你的会话的Redis数据库后端 安装工具可用设置变更日志文件安装运行 pip install django-redis-sessions 或者另外...

    log-sessions-2021-09-21-183121.session

    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-py2.py3-none-any.whl" 这个标题明确指出我们正在讨论的是一个Python库,具体是`django_user_sessions`,版本号为1.1.0。`.whl`文件是一种Python的可分发格式,用于方便安装...

    i-Sessions - MetaTrader 5脚本.zip

    在MT5中,“i-Sessions”是一款特别设计的脚本,用于显示和分析全球不同市场的交易会话,这对于全球交易者理解市场动态至关重要。 交易会话是指金融市场在特定时间段内的活跃交易时段。主要的交易会话包括亚洲、...

    Python库 | Products.Sessions-4.11-py2.py3-none-any.whl

    标题中的"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

    标题中的“PyPI 官网下载 | p2.ui.sessions-0.3.3-py3-none-any.whl”指的是在Python的包索引服务(Python Package Index,简称PyPI)上发布的名为`p2.ui.sessions`的软件包的特定版本0.3.3。这个包是为Python 3编写...

    PyPI 官网下载 | django-user-sessions-0.1.0.tar.gz

    `django-user-sessions-0.1.0.tar.gz`文件提供了Django用户会话管理的增强版工具,帮助开发者构建更安全、更高效的Web应用。通过集成这个库,可以更好地管理用户会话,提升应用的用户体验,同时增强了系统的安全性。...

    Python库 | django-multi-sessions-0.1.0.tar.gz

    "django-multi-sessions-0.1.0"库扩展了Django的默认会话机制,通过引入更高效的会话存储策略,使得在处理大量并发用户时,服务器可以更好地管理这些会话。具体来说,它可能包括以下特性: 1. **分布式存储**:该库...

    PyPI 官网下载 | Products.Sessions-4.11-py2.py3-none-any.whl

    资源来自pypi官网。 资源全名:Products.Sessions-4.11-py2.py3-none-any.whl

    PyPI 官网下载 | django-mongo-sessions-0.0.3.tar.gz

    标题中的“PyPI 官网下载 | django-mongo-sessions-0.0.3.tar.gz”指的是Python的包管理器PyPI(Python Package Index)上发布的名为“django-mongo-sessions”的软件包,版本为0.0.3,其源代码以tar.gz格式打包提供...

    Python库 | Products.Sessions-4.5-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:Products.Sessions-4.5-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | Products.Sessions-4.12-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:Products.Sessions-4.12-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | dj-dynamodb-sessions-0.8.4b0.tar.gz

    标题中的“dj-dynamodb-sessions-0.8.4b0.tar.gz”是一个Python库的压缩包,主要用于处理Web应用程序的会话管理。这个库的独特之处在于它将会话数据存储在Amazon DynamoDB数据库中,而不是传统的文件系统或内存中。...

Global site tag (gtag.js) - Google Analytics