Cookie和Session详解

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

1.Cookie

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

Cookie只存储在客服端
Cookie是什么:Cookies是web服务器存放在用户硬盘的一段文本,Cookies允许一个wen站点在用户的机器存放一些文本的信息,并可以在以后重新获取它。这个基于文本的信息存储着一些“键-值”对。
在这里插入图片描述
Cookie在http浏览器里面的使用过程

  1. 当浏览器发送请求时,它会查看你机器上跟域名www.test.com有关的Cookie文件,如果存在同www.test.com有关的 Cookie,浏览器就会把相关的Cookie“键-值”对数据跟请求一起发送到服务器(),如果不存在同www.test.com有关的 Cookie,则浏览器不发送Cookie到服务器。
  2. 服务器如果返回Cookie,浏览器会把Cookie存储在域名www.test.com有关的Cookie文件中,提供给下次请求调用
  3. .当然,不是全部Cookie都会存储起来,Set-Cookie设置的过期时间

(1)持久性cookie,设置了cookie的时间,以文件方式存在硬盘上
(2)会话cookie,没有设置cookie时间,cookie的生命周期也就是关闭浏览器前就消失,一般不会保存在硬盘,而是保存在内存上

  1. 所以单纯使用Cookie不安全

Cookie其实就是键值对存储在文件中,如果一些用户名都存储在里面,只需简单修改文件里面的用户名,就可以达到模仿他人登录,所以相对不安全,当然可以通过其他手段避免,例如加密加盐

服务端产生cookie的方式

Cookie cookie = new Cookie(“company”,“beijing”);
cookie.setMaxAge(60*60);
setMaxAge里面的参数为整形,单位是秒
该值大于0,表示将cookie存放在客户端的磁盘上
该值小于0,与不设置效果一样,表示cookie存放在浏览器缓存,关闭浏览器cookie失效
该值等于0,表示cookie一生成立马失效

2.Session

Session存储在服务端

简单来说,一个请求到达的时候,服务器会先判断是否带有Session信息。如果有,则根据Session ID去数据库中查找是否具有对应的用户身份信息。此处可能会出现Session失效、非法的Session信息等可能性,那么服务器视同无Ssession信息的情况,重新的产生一个随机的字符串,并且在Http返回头中写入新的Session ID信息。另一者,如果服务器成功获取了用户的身份信息则以该身份为请求者提供服务。在http中,客服端的请求里面的session id一般是通过cookie带过来的,所以Session也依赖于cookie。

1、Session原理

  1. 服务端对session是以map的形式管理的,执行getSession(true)创建一个32位随机字符作为key放在散列表里面,value是HttpSession对象
  2. 服务器生成32位的JSESSIONID,把JSESSIONID作为key放在cookie里面,JSESSIONID
    的值作为value发送给客户端
  3. 客户端保存session信息,下次请求服务器时会携带JSESSIONID值
  4. 服务端拿到JESSIONID的值会去session列表查找对应的value
    在这里插入图片描述
    2、session的失效
    session.invalidate(); //http status 500 失效的session并不为null

3、cookie禁用后使用session进行会话跟踪
客户端不接收服务端发过来的cookie信息,但是每次客户端访问服务器时服务器都会重新生成新的JSESSIONID放到cookie里面
解决办法:
(1)服务端重定向跳转(302)url后面添加;jsessionid=value
String uri =request.getContentPath()+"/otherPage";
//解决cookie禁用后,session跟踪问题
uri =response.encodeRedirectURL(uri);
response.sendRedirect(uri);
问题:不安全,站点不允许禁用cookie,JSESSIONID会暴露在浏览器里面
(2)表单隐藏字段
<input type=“hidden” name=“jsessionid”, value=""/>
真正 会话的结束是session的失效

4、session一致性
session+redis实现session共享,客户端第一次发送请求后,NGINX将请求发送给服务器1,由于用户未登录,服务器1创建session并且把session信息同步到redis里面,服务器1响应客户端的同时把session信息发送给客户端,客户端携带session再次访问NGINX的时候,NGINX把请求分发给了服务器2,由于服务器2上面没有session信息,服务器2拿着客户端携带的session信息去redis里面查找用户信息,找到的话就把响应返回给客户端
在这里插入图片描述

Session和Cookie的区别

1、cookie和session都是服务端生成的,只是cookie存放在客户端,session存放在服务端
2、cookie是不安全的,黑客可以通过抓包获取用户信息,session是安全的因为存放在服务器
3、session因为存放在服务端,当session数量比较多时会占用一定的内存空间造成服务器性能低
4、单个cookie的大小是4k, 很多浏览器限制一个站点最多保存20个cookie,而session保存在服务端没有大小限制
5、cookie和session都会有时间限制,即都会过期
6、session的使用依赖cookie,会把JSESSIONID保存在cookie里面

五:场景应用
用户输入用户名密码后查看服务端的头部信息,如下图是个post表单,输入的是用户名和密码,服务端在response请求头添加了set-cookie:JSESSION的字段记录用户信息并返回给客户端,客户端会把session信息持久化到磁盘里面,下次再次访问服务端的时候就会携带cookie信息去服务端校验用户的真实性,这样客户端和服务端就做到了会话跟踪,知道上个请求是哪个客户端发来的请求,以及此次请求的客户信息。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值