最近在优化之前给学校写的一个项目,发现了同一个浏览器(IE,Firefox)开多个选项卡的时候不能登录多个用户,后一个登录用户会把前一个用户给覆盖了,我的登录逻辑是把user对象存放到session中的,究竟为什么呢?经过各种debug,查看浏览器的网络请求信息,终于发现了其中的问题。

  首先,先说明下服务器中session的机制,因为http协议不同tcp,客户端不是与服务端建立一个长连接的,所以客户端与服务端要建立一一对应的关系只能使用另一种机制,session+cookie实现会话跟踪,禁用cookie的情况暂时不讨论。在客户端没有禁用cookie的情况下,每次向后台服务器发出请求,都会发送cookie中的jsesessionid,而服务端是根据这个jsessionid的值来进行服务端检索到该session的。

  

  上面可以看到,请求头中包括了一个cookie,那么这个cookie的jsessionid究竟对应的是不是服务器中session的id?下面我们来看看服务器中的session对应的id究竟是多少。下图是服务端中session的id。

  经过比对,可以确定请求中的jsessionid对应的就是服务器该session对应的id,接下来,继续开另外一个选项卡进行服务器的访问,查看两个选项卡登录不同的用户时候的情况。

  我发现,另外一个选项卡的请求头中的cookie和第一个的是一样的,经过后台查看,他们对应的sessionid也是一致的,那么用户覆盖的问题就应该出现在这里了,同一个浏览器访问同一个网站,他们是根据客户机的cookie来追踪在服务器中的会话的,如果多个用户使用session.setAttribute("user", user);方法来存储当前的登录的用户信息,那么后面的登录用户肯定会将前面的用户覆盖。这个问题我查看了一下京东究竟是怎么实现同一个浏览器登录多个用户的,发现他们一个浏览器只能登录一个用户,想登录另外一个用户必须把当前用户退出才能进行另一个用户的登录。

  经过短暂的思考我也实现了类似的功能,首先登录的时候我先查找session中的user是否存在,如果存在,则直接跳转到登录成功的页面,否则再进行数据库中的用户的查找,这样子,只要在session没有失效的情况下,同一时刻就只能登录一个用户,要登录另一个用户就只能退出当前用户或者开不同的浏览器进程来登录,因为同一类型的浏览器读取的cookie还是一样的。

用户会话跟踪机制(session+cookie)的更多相关文章

  1. 浏览器禁用Cookie,基于Cookie的会话跟踪机制失效的解决的方法

    当浏览器禁用Cookies时.基于Cookie的会话跟踪机制就会失效.解决的方法是利用URL重写机制跟踪用户会话. 在使用URL重写机制的时候须要注意.为了保证会话跟踪的正确性,全部的链接和重定向语句 ...

  2. JSP基础--会话跟踪技术、cookie、session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  3. 会话跟踪技术——Session

    一.什么是Session Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期.在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分. Se ...

  4. 会话跟踪之Session

    Session是服务端使用记录客户端状态的一种机制,Session使用简单,但是和Cookie相比,增加了服务器的存储压力[因为为了追求速度,服务器将Session放置在了内存中].Cookie是保存 ...

  5. 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式

    解释HTTP HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否 ...

  6. (九)会话跟踪技术之Cookie

    --部分摘自孤傲苍狼博客~ 一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再 ...

  7. 关于用户登录状态存session,cookie还是数据库或者memcache的优劣

    session中保存登陆状态: 优:整个应用可以从session中获取用户信息,并且查询时很方便.在session中保存用户信息是不可缺少的(web应用中) 缺:session中不宜保存大量信息,会增 ...

  8. 会话技术(session/cookie)

    session可保存int double bool array string object:cookie只能保存stringsession 可通过php.ini文件查看存放的位置:cookie不同浏览 ...

  9. 会话跟踪技术之——cookie

    1.cookieForm <%@ page language="java" contentType="text/html; charset=UTF-8" ...

随机推荐

  1. Learning Android ActionBar

    PART1:Make Android2.1 Support ActionBar Last evening I learnt how to make android2.1 support actionb ...

  2. OpenResty创造者

    OpenResty 是一个开源的 Web 平台,用于开发高性能和高动态的 Web 网关或者 Web 应用.OpenResty 最早是为了支持全网搜索引擎周边的相关搜索的 API 接口,后来我们基于 N ...

  3. Qt工程pro文件的简单配置(尤其是第三方头文件和库)

    Qt开发中,pro文件是对正工程所有源码.编译.资源.目录等的全方位配置的唯一方式,pro文件的编写非常重要,以下对几个重要项进行说明(win和linux,mac平台通用配置) 注释 以”#”开始的行 ...

  4. python 之生产者消费者模型

    进程实现: import time,random from multiprocessing import Process,Queue def producer(name,q): count= 0 wh ...

  5. python 之 staticmethod,classmethod,property的区别

    绑定方法和非绑定方法: 普通def定义的都是绑定给对象的方法,对象调用时会自动传入对象本事,而类调用时需手动传入对象. 加上@classmethod装饰器就是绑定给类的方法,会自动传类本身 加上@st ...

  6. 发送邮件小工具(python)

    #!/usr/bin/python # -*- coding:UTF- -*- import sys import smtplib import email.mime.multipart import ...

  7. Laravel中的模板引擎Blade

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. (3)ASP.NET Core 服务生命周期

    1.前言 在ConfigureServices方法中的容器注册每个应用程序的服务,Asp.Core都可以为每个应用程序提供三种服务生命周期:●Transient(暂时):每次请求都会创建一个新的实例. ...

  9. Weekly Contest 111-------->941. Valid Mountain Array(max_element)

    Given an array A of integers, return true if and only if it is a valid mountain array. Recall that A ...

  10. IT兄弟连 JavaWeb教程 JSP动作指令

    JSP动作指令语法 JSP动作指令语法格式如下: <jsp:动作名 属性名1="属性值1" 属性名2="属性值2" ... %> JSP具体动作指令 ...