1、为什么有Session和Cookie

根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接。TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于同一个客户端。因此,HTTP通信是无状态的。服务器认为每次请求都是一个全新的请求,无论该请求是否来自同一地址。

但是这也带来了问题,假如不使用Session或Cookie,那么就意味着假如你登录了某个购物网站,你的每次请求因为无状态,购物网站的服务器都无法判断你的身份和登陆与否,意味着为了保持登陆你必须浏览某个商品时登陆一次,浏览另一个商品又要登陆一次。

这种用户体验谁还愿意上购物网站?于是出现了Cookie,它把少量的用户信息存储在用户自己电脑上,因为它在同一个域名下是全局的,所以用户访问时,服务器就可以从该域名下任意页面读取Cookie中的信息,以判断登陆状态。

但Cookie存在用户端,存储尺寸也有大小限制,用户自身还可以禁用,甚至可见并修改,安全性极差。为了安全,又能方便地读取全局信息,于是出现了新的存储会话机制,Session。

2、Session们谁是谁的谁(实现机制)

有了Session,就能让用户在一次会话中的多次HTTP请求产生关联,让多个页面都能读取到Session域里面的值。Session信心存放在服务器端,也很好地解决了安全问题。

但是同样有疑问,若干客户端和服务器连接,服务器会为每个客户端的一次会话创建一个会话对象Session,如何区分哪个Session对应的是哪个客户端呢?

答案是,多数容器是采用Cookie机制来实现Session机制,也就是说,利用Cookie来保存 “客户端” 和 “服务器里会话对象” 之间的对应关系。

使用Cookie实现会话机制的过程是
  • 当容器创建一个新的HttpSession对象后,会生成一个随机数,称之为会话ID,并将ID值封装成一个名为JSESSIONID的Cookie,返回给客户端;
  • 之后的请求,在调用request.getSession方法获得会话对象时,容器会先从request中获取JSESSIONID的值,根据值查找到对应的会话对象,返回使用;
  • 如果没有获得JSESSIONID值,则容器认为当前请求没有相关联的会话对象,会重复第一步进行生成。

实际上,整个过程很像点餐:
  • 去餐馆点了牛排,得到号码牌(JSESSIONID)
  • 你走开了几步之后,服务员就忘了你是谁
  • 你如果想取你的牛排,你就需要这个号码牌去找服务员领
  • 服务员能根据号码牌确认你是顾客,你点过餐,把你对应的牛排拿给你


3、Cookie被阻止的处理

Cookie在浏览器设置是可以被阻止的,那么根据其Session的实现机制,如果Cookie被禁用,那么Session也会受到影响。

Cookie被阻止,那么根据其实现机制,则找不到JSESSIONID的Cookie,会认为是首次登陆,所以无法利用Session保持用户的登陆状态。

解决办法:强制把JSESSIONID传递给相关资源

Java Servlet API 中提出了跟踪Session的另一种机制,如果客户端浏览器不支持Cookie,容器可以重写客户请求的URL,把JSESSIONID添加到 URL信息中。HttpServletResponse接口提供了重写 URL 的方法:public String encodeURL(String url) 

  • 先判断当前的Web组件是否启用Session,如果没有启用Session,直接返回参数url
  • 如果启用Session,再判断客户端浏览器是否支持Cookie
    • 如果支持Cookie,直接返回参数url
    • 如果不支持Cookie,就在参数url中加入JSESSIONID信息,然后返回修改后的url

如点击以下链接:
<a href = <%=response.encodeURL("admin/doServlet")%> >URL重写访问</a> 
 
1
<a href = <%=response.encodeURL("admin/doServlet")%> >URL重写访问</a> 

 

4、Cookie和Session的区别

  • 都是保存用户信息,不同在于Session存储在服务器端,Cookie是存储在客户端
  • Session中可以保存任意对象,Cookie只能保存字符串
  • Session随会话结束而关闭,Cookie可以长期保存在客户端硬盘上,也可以临时保存在浏览器内存中
  • Session用来保存重要信息,Cookie用来保存不重要的用户信息


[06] Session实现机制以及和Cookie的区别的更多相关文章

  1. session生命周期,与cookie的区别

    sessinon在用户访问第一次访问服务器时创建. Session什么时候失效? 1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效.Tomcat中Sessio ...

  2. Session认证机制与JWT认证机制

    一.什么是身份认证? 身份认证(Authentication)又称"身份验证"."鉴权",是指通过一定的手段,完成对用户身份的确认.日常生活中的身份认证随处可见 ...

  3. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  4. Cookie/Session的机制与安全

    转载自:https://harttle.land/2015/08/10/cookie-session.html Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以 ...

  5. COOKIE和session的机制详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  6. Cookie/Session的机制

    Cookie的机制 Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能. Cookie的Domain和Path属性标识 ...

  7. php中session实现机制

    一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...

  8. session跟cookie的区别

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  9. session和cookie的区别

    cookie机制和session机制的区别     具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.     同时我们也看到,由于才服务器 ...

随机推荐

  1. mysql_view

    概述: 视图即是虚拟表,也称为派生表,因为它们的内容都派生自其它表的查询结果.虽然视图看起来感觉和基本表一样,但是它们不是基本表.基本表的内容是持久的,而视图的内容是在使用过程中动态产生的.--摘自& ...

  2. 常用perl脚本工具

    1.批量添加license:PrefixLicense.pl (1)给单一c/c++源文件添加license: perl PrefixLicense.pl apache_license src_fil ...

  3. VRTK实现瞬移需要添加的脚本

    进入一个新的公司,boss让实现漫游,但是新公司的Unity版本是5.6,我之前的瞬移插件不好用了,无奈之下找到一个我不熟悉的插件VRTK,但是查了很多资料也没有实现瞬移.经过自己查脚本与实验终于得到 ...

  4. easyUI datagrid 列宽自适应(简单 图解)(转)

    响应数据格式: easyUI在html代码中结构: 发现了什么没有,我们的表头其实是一个td在td中有一个属性field那么我们就可以获得了; 以下就是自适应代码: //添加事件 function c ...

  5. 【Linux】MySQL解压版安装及允许远程访问

    安装环境/工具 1.Linux( centOS 版) 2.mysql-5.6.31-linux-glibc2.5-x86_64.tar 安装步骤 1.下载mysql解压版(mysql-5.6.31-l ...

  6. 【win10】大水牛主机插入耳机没有声音

    主机:大水牛,技嘉主板 操作系统:win10 问题:主机前面插入耳机,没有声音,扬声器图标出错 解决 一..插入耳机 二..Realtek高清晰音频管理器 1.打开音频管理器,点击右下角的设置 2.点 ...

  7. 新鲜出炉的JSON,拿走不谢!

    一.JSON简介 1.JSON全称是JavaScript Object Notation即JavaScript对象标记法. JSON是一种轻量级(Light-Weight).基于文本的(Text-Ba ...

  8. VMware Workstation 12 Pro 之安装XP系统

    使用VMware Workstation 12 Pro  安装XP系统 ... <个人觉得现在没有必要再给自己的电脑装XP系统了.虽然XP很小..但是功能相比现在的Windows差很多.兼容性与 ...

  9. 用notepad如何在每行结尾处添加特殊字符

    在处理关键词的时候,有时候需要将每一行的末尾添加某个特殊字符,较常用的一种方法就是用excel拼接起来.今天要分享是一种简单的方法,用notepad就可以很容易实现,主要用到notepad中的扩展匹配 ...

  10. Java中的方法

    Java方法/函数 方法的定义: Java方法是语句的集合,他们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 方法的优点 使程序 ...