由于HTTP是一种无状态的协议,服务器端无法知道用户与客户端交互的状态,比如如果一个用于之前已经访问过该服务器,服务器无法知道该用户是第二次访问,Session和Cookie都是用来保存用户与后端服务器的交互状态,简单来说Cookie存储在用户端,而Session存储在服务器端,这种存储方式的不同造成了二者在使用上的巨大区别

  • 由于Cookie在客户端,每次请求的时候都要带着Cookie,如果Cookie非常大且每天的流量很大那么Cookie会占用很大带宽
  • Session在服务器端,但他只保存在一个服务器上,所以多台服务器共享Session会出现问题

1、理解Cookie

  当用户第一次访问服务器的时候,服务器会生成一些Key-Value对并放在客户端,并为这些数据加上一些限制条件。当客户端第二次访问浏览器到时候会带上这些Key-Value对,服务器会根据Key-value来划分用户。比如根据Cookie来判断用户是否登录,比如根据用户上次的访问记录来判断哪些数据被该用户频繁访问,并做出相应的缓存

1.1 Cookie属性项

  除了想要保存的Key-Value之外还会有一些Cookie的属性项。

1.2 Cookie如何工作

  Tomcat在Response类中完成返回值的Cookie的构建,把Cookie对象构造成一个字符串放在返回信息的Header中。

  客服端发起请求的时候,浏览器会根据URL路径把所有符合条件的Cookie放在Request的请求头中传给服务端。

1.3 使用Cookie的限制

  虽然在写爬虫的时候Cookie和Header是两个字段,但其实Cookie是放在Header中的。浏览器对Cookie的限制主要是大小和数量的限制。

2、理解Session

  为了解决Cookie每次传输占有大量带宽的问题,出现了Session。客户端第一次访问服务端的时候,服务端生成一些信息但不传回客户端,而是保存在服务端并把信息的ID传回给客户端。这样下次客户端在发送信息的时候只需要发送该ID即可。所以Session是基于Cookie的,即在Cookie的键值对集合里加入一个名为JSESSIONID的键值对。

2.1 Session与Cookie

  大部分情况下Session是基于Cookie来实现的,基于Cookie的Session就是Cookie中普通的一个属性,即在Cookie中找到JSESSIONID对应的Value然后完成后续处理。

  如果浏览器禁用了Cookie则默认采用基于URL Path parameter的Session。此时浏览器会把SessionCookieName重写到用户请求的URL参数中,SessionCookieName默认就是JSESSIONID。

2.2 Session如何工作

  自己写简单的TomcatWeb项目的时候可以发现及时没有设置Cookie的字段,只要开始了Cookie功能浏览器发来的请求中的Cookie都会带有JSESSIONID。服务端发现一个JSESSIONID没有找到对应的Session对象的时候就会创建一个新的Session对象,并保存在Manager维护的Session容器里。Manager会管理所有的Session,如生命周期、服务器关闭序列化到磁盘上。只有调用Tomcat容器的stop方法才会保存所有未过期的Session对象,直接KILL是不会保存的。

3、Cookie安全问题

  Cookie是保存在浏览器里的,很多插件是可以编辑Cookie的。相对保存在服务器端的SessionCookie不够安全。

4、分布式Session框架

4.1 谁家的孩子谁抱走

  在分布式环境下,不同的应用服务器存储的Session不同,所以单独使用Session是不行的。Cookie很好的解决了这个问题,因为Cookie是在浏览器端的,即使请求被转发到不同的服务器上,但是浏览器都会带上自己的Cookie,身份认证不会出现问题。这种被称为谁家的孩子谁抱走的策略存在以下问题:

  • 安全问题。Cookie毕竟是不安全的
  • 限制问题。浏览器对Cookie是根据域名有数量限制的

4.2 分布式Session

6、表单重复提交

  无论是恶意的还是由于网速问题带来的表单重复提交都是需要防止的,既可以通过一个中间跳转页面来实现,也可以通过Token来实现。

  要实现防止表单重复提交就需要标识用户的每一次访问请求,使每一次访问对服务端都是唯一确定的。当用户第一次来到登陆页面的时候,后台发放一个token并放到该次请求的Session中,然后在form表单中hidden域里提交token。第一次表单提交的时候后台可以看到form里的token和后台记录下的该token是一致的,放行并清除该Session的Token。当第二次表单提交的时候发现提交过来的token为空,则不予放行。

   

7、多终端Session统一

  

  

Cookie Session 与Token的更多相关文章

  1. 存储机制 cookie session jwt token

    cookieCookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网 ...

  2. Cookie.Session到Token和JWT

    一.session和cookie: 现在一般都是session和cookie一起用,一起提.但是他们俩其实不是一定要在一起. session的产生原因是,http协议是无状态的 这就导致了,不同的用户 ...

  3. cookie,session和token的概念以及区别

    cookie: 采用客户端保存状态的方案: cookie的组成:名字,值过去时间,路径以及域: 没有设置时间:随着浏览器的打开和关闭决定: 设置了时间:浏览器就会把cookie保存在硬盘上,根据时间来 ...

  4. cookie、session与token

    一.详述概念 1.Cookie机制 cookie机制是采用在客户端保持状态的方案(cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力).cookie的使用是由浏览器按照一定的原则在后台自 ...

  5. cookie,session,token的定义及区别

    参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...

  6. cookie, session, token 是什么 以及相应的安全考量

    Cookie cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面 cookie 更主要的是针对和server通信的,我们知道http 是无状态的,那如果 ...

  7. cookie、session和token

    https://zhuanlan.zhihu.com/p/25495290?utm_source=wechat_session&utm_medium=social 一.cookie 众所周知, ...

  8. Cookie、Session 和 Token区别

    1 Cookie.Session 和 Token 都是用来做持久化处理的,目的就是让客户端和服务端相互认识.Http 请求默认是不持久的没有状态的,谁也不认识谁.   2 Cookie: 是存放在客户 ...

  9. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

随机推荐

  1. 探索Windows命令行系列(4):通过命令操作文件和文件夹

    1.文件夹操作 1.1.DIR(directory)命令 1.2.TREE 命令 1.3.CD(change directory)命令 1.4.MD(make directory)命令 1.5.RD( ...

  2. ldap配置系列三:grafana集成ldap

    ldap配置系列三:grafana集成ldap grafana的简介 grafana是一个类似kibana的东西,是对来自各种数据源的数据进行实时展示的平台,拥有这牛逼的外观.给一个官方的demo体验 ...

  3. Android IllegalArgumentException: Cannot draw recycled bitmaps解决方法

    在编码图集过程中,出现了Android IllegalArgumentException: Cannot draw recycled bitmaps错误. 大致意思是:不能使用已经被回收的bitmap ...

  4. 痞子衡嵌入式:ARM Cortex-M内核那些事(3)- 功能模块

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M功能模块. ARM Cortex-M处理器家族发展至今(2016),已有5代产品,分别是CM0/CM0+.CM1 ...

  5. 使用asp.net mvc + entityframework + sqlServer 搭建一个简单的code first项目

    步骤: 1. 创建一个asp.net mvc 项目 1.1 项目创建好结构如下 2 通过vs安装EntityFramework框架 install-package entityframework 3. ...

  6. PHP Composer 依赖管理的用法

    1:下载 1.1:方法一: 通过PHP来安装 cd G:\web\es6 curl -sS https://getcomposer.org/installer | php #这个命令会下载compos ...

  7. python学习笔记(十 四)、web.py

    使用web.py 通过python进行网页的编写,下面我们来简单了解一哈web.py 的使用 1 url处理 使用特定的url结构来解析我们发送的请求.如下面所示: urls = ( '/login' ...

  8. Java学习笔记之——IO

    一. IO IO读写 流分类: 按照方向:输入流(读),输出流(写) 按照数据单位:字节流(传输时以字节为单位),字符流(传输时以字符为单位) 按照功能:节点流,过滤流 四个抽象类: InputStr ...

  9. 零基础学Python--------入门篇 第1章 初始Python

    入门篇 第1章  初始Python 1.1  Pyhton 概述 1.1.1 了解 Python Python,本义是指“蟒蛇”.1989年,荷兰人Guido van Rossum发明了一种面向对象的 ...

  10. paas saas iaas 区别

    最近在公司里面经常听到一些paas saas iaas云服务的名词,把我自己都听蒙圈啦,所以就各种找资料终于对这三个名词有了一定的了解 首先上一张图如下: IAAS(nfrastructure as ...