最近在优化之前给学校写的一个项目,发现了同一个浏览器(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. python 二分法例子及冒泡排序

    #!/usr/bin/env python #-*- coding:utf-8 -*- def binary_search(source_data,find_nu): mid = len(source ...

  2. BZOJ_4809_皇后_爆搜

    BZOJ_4809_皇后_爆搜 Description 众所不知,rly现在不会玩国际象棋.但是,作为一个OIer,rly当然做过八皇后问题.这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在n*n的 ...

  3. liunx环境下安装tomcat

    第一:下载tomcat的安装包

  4. 「LuoguP2252」 取石子游戏(威佐夫博弈

    [P2252]取石子游戏 - 洛谷 题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以 ...

  5. POJ 3104 Contestants Division

    Contestants Division Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10597   Accepted:  ...

  6. B. Vanya and Food Processor【转】

    B. Vanya and Food Processor time limit per test 1 second memory limit per test 256 megabytes input s ...

  7. 继承映射关系 subclass的查询

    Person大类的映射文件配置 1 <hibernate-mapping package="com.zh.hibernate.subclass"> <class ...

  8. vue中引入公共方法并使用

    test.js文件(公共js文件) function myFun() { console.log('this is my function') } export { myfun } // 2 expo ...

  9. POJ3737【数学】

    高中数学题?初中吧///然后注意一下POJ的double输出用%f.......... #include <iostream> #include <stdio.h> #incl ...

  10. builtin_shaders-5.3.4f1学习-Sprites-Default

    Shader "Sprites/Default" { Properties { [PerRendererData] _MainTex ("Sprite Texture&q ...