由于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. Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署

    运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...

  2. Java开发知识之Java的包装类

    Java开发知识之Java的包装类 一丶什么是包装类 包装类的意思就是对基本数据类型封装成一个类.这些类都是Number的子类.区别就是封装数据类型不同.包含的方法基本相同. 具体可以查询JAVA A ...

  3. 为 docker 中的 nginx 配置 https

    没有 https 加持的网站会逐渐地被浏览器标记为不安全的,所以为网站添加 https 已经变得刻不容缓.对于商业网站来说,花钱购买 SSL/TLS 证书并不是什么问题.但对于个人用户来说,如果能有免 ...

  4. Docker搭建ElasticSearch+Redis+Logstash+Filebeat日志分析系统

    一.系统的基本架构 在以前的博客中有介绍过在物理机上搭建ELK日志分析系统,有兴趣的朋友可以看一看-------------->>链接戳我<<.这篇博客将介绍如何使用Docke ...

  5. mac终端代理

    终端代理,需要首先有自己的梯子,以下方式需要配合shadowsocks 终端FQ有很多好处,对于一个程序员来说,墙外有很多优秀的代码,走终端可以方便下载和使用- (编程思想强调复用,软件开发避免重复造 ...

  6. c语言之gdb调试。

    1.此文档演示如何使用gdb调试c语言代码. 代码如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; dig ...

  7. 好用的Chrome插件推荐

    无扩展,不 Chrome :几款 Chrome 扩展程序推荐 相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多 ...

  8. 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad

    目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 ...

  9. 第23章 Windows身份验证 - Identity Server 4 中文文档(v1.0.0)

    在支持的平台上,您可以使用IdentityServer使用Windows身份验证对用户进行身份验证(例如,针对Active Directory).当前使用以下命令托管IdentityServer时,W ...

  10. BootStrap之 提示工具(Tooltip)插件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...