如果你对于session 和cookie 只有一点模糊理解,那么此篇文章能帮你用简单的方式更深入理解session和cookie ,这篇文章会告诉你这些:
为什么要有session 和cookie?
Session 和cookie它们是如何工作的?
session和cookie 它们有什么联系,又有什么区别?
1、为什么要有session 和cookie?
万物皆有它存在的理由,至于session 和cookie 为什么会出现那么我们只能问他的亲爹http了,就像我们生了个儿子是为了延续后代,有人养老送终,http养了这两个儿子又是为什么呢?所以我们首先得了解一下这个亲爹;
1-1、什么是Http?
Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) ,它是基于 TCP/IP 协议的应用层协议。它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式。
简单的说,http 是互联网请求数据传输的一种规范,它规定了客户端与服务器之间互相通信的数据格式规则。它是基于TCP/IP协议之上的应用层协议,这就好像球类运动(TCP/IP)和足球(HTTP)的关系,在球类运动里规定一个只能用脚踢的球类运动规则,这类规则形成的运动名字就叫足球。
HTTP 协议一共有几个特点:支持客户/服务器模式;简单快速;灵活;无连接,无状态。其中HTTP无状态的特性将和我们今天的主题有密切关系。
1-2、http 的无状态
http 是一种无状态的协议,”无状态”其实这种描述有点模糊,这里的无状态更精确的说法应该是”
不保存请求的状态信息”的意思,http要做的事就是规范WEB数据传输格式,协议本身不会对请求和响应的通信状态进行保存。
至于http什么要这么做,主要有下面几个原因:
1、职责单一化:既然我是个协数据传输协议,那么我就只做协议层需要做的事情,保存临时请求状态类的信息那是缓存的功能。
2、方便扩展:只有把一件事情做的越简单,那么它的伸缩性才越好,
比如:如果你是生产自来水的,那你安安心心只生产自来水就行了,这样的话那些生产任何饮料的都可以从你这里进货,只要需要自来水的地方都可以和你合作。但是结果你为了水的味道好一点,在水里面加了一点糖,这样就会造成做茶类的饮料没办法和你合作了,因为茶里面是不需要加糖的。
3、提升效率:不需要保存额外的信息请求的速度当然要快一些。
1-3、http的无状态带来的问题
因为http是不保存状态信息的,所以这就意味着两次请求之间是没办法建立联系,这就造成了前一个请求已经做过的事情,后面的请求还是照样要做一次。
比如我们最常见的系统功能”登录验证”:
我们系统很多功能都需要进行登录才可以操作,比如说,查看个人信息、下单、加好友.........等等;
这里如果我们不保存用户登录的状态信息,那么我每次查看个人信息之前都需要先进行登录,然后才能查看到个人信息,那么多个请求就会以这样的形式体现出来。
查看个人信息请求:登录=>查看个人信息
下单请求: 登录=>下单
加好友请求: 登录=>发送好友申请
当你看到上面的请求执行情况,你应该就发现了问题,明显登录其实只要做一次就行了,那么我们是否可以在用户第一次登录后就把用户的登录状态保存起来呢,以后的请求只需要通过这个状态来判断用户是否有进行登录,那么是否就能避免用户需要重复的登录呢? 所以就出现了我们的http状态保持方案,cookie 和session;
2、Http无状态解决方案之Cookie
cookie是把请求状态存储在客户端的一种解决方案;因为http的无状态,我们无法识别历史请求的状态信息,所以就想出了一个办法,服务端会在每个客户端第一次请求的时候颁发一个通行证,不管服务端和客户端都可以往这个通信证里存入状态信息,然后交由客户端保存,客户端以后每次向服务器发起请求的时候都会带上这个通行证,通过在这种方式来保持请求之间的联系。
2-1、cookie生成和操作。
(1)java操作cookie//获取cookie
Cookie[] cookies= request.getCookies();//添加cookie
Cookie cookie=
newCookie(
"name",
"susan");//设置有效时间(秒)
cookie.setMaxAge(1000);//当请求是HTTPS或者其他安全协议时才传输cookie
cookie.setSecure(
true);//设置cookie是否能通过 js 访问
cookie.setHttpOnly(
true);//设置cookie作用域 doman+path形成一个cookie作用范围
cookie.setDomain(
"http://baidu.com");
cookie.setPath(
"/user");
response.addCookie(cookie);
(2)前端javascript操作cookie//获取cookie
document.cookie
//设置cookie
document.cookie = "name=Jonh; ";
通过页面我们可以看到,每次请求服务器通过response设置cookie 后,客户端每次请求都会把cookie存到request header 里传给服务器。
2-2、cookie属性修改
虽然服务端可以生成添加cookie,但是服务端是无法直接修改客户端传输过来的cookie的值的,服务端只能通过创建一个名称相同的cookie来覆盖想修改的cookie,浏览器发现有相同名称的cookie时只会保留最新的发送给服务器。
比如你想修改名称为A的cookie那么可以创建一个名称为A的cookie来覆盖它。
Cookie cookie=
newCookie(
"A",
"1111");
response.addCookie(cookie);
2-3、删除cookie
主动设置有效期删除
Cookie并没有提供直接删除的方法,我们只能通过setMaxAge(-1)设置有效期来简介达到删除cookie的效果。
持久cookie:如果通过setMaxAge设置了cookie的有效期时间大于0,则浏览器会把该cookie持久化到磁盘,然后根据设置的时间判断过期则失效。
临时cookie:当通过setMaxAge设置cookie的有效时间为负数,此时的cookie就属于一个临时cookie,临时cookie只会保存在客户端内存里面,当浏览器关闭后就会失效。
3、Http无状态解决方案之session
session是把状态信息保存在服务端的一种解决方案,那么为什么有了Cookie之后还需要有seesion呢,其实我们在了解cookie的特点后知道我们的cookie是存储在客户端的,所以会存在一些不可控的问题,比如说cookie可以被窃取,而且cookie的大小也被客户端所限制,所以会存在一些不安全的因素,所以那就只能把状态信息保存到服务端,交给服务端自己控制,而session则就是服务端保持状态的解决方案。
Session是如何生成的?
当客户端(浏览器)访问服务端时服务端首先会读取cookie;
如果cookie里面包含一个JSESSIONID的值,那么服务端会根据对应的JSESSIONID 从内存里面获取对应的session。
如果cookie 没有JSESSIONID 那么服务端会认为这是用户第一次访问,那么就会新生成一个session保存到内存里面,然后把session的唯一ID添加到cookie里面,就键的名称就是我们上面的JSESSIONID。
服务端生成session并把seesion的ID添加到cookie里面后,客户端每次请求访问都会带上cookie。
Session是如何删除的?
1、服务端可以设置session的超时时间,session超时后会被删除。
2、调用HttpSession.invalidate()方法删除sesion。
3、服务器进程停止。
cookie被禁用如何使用sesion?
我们从session使用流程中可以知道,其实session虽然是服务端保存的,但是也还是需要客户端的配合才能使用,而这个配合通常都是cookie来保存session的sesion ID,然后客户端每次都带上cookie,服务端通过sesion ID来识别客户端的身份。
但是这样有一个问题,我们知道客户端是可以禁用cookie的,如果客户端禁用了cookie后我们如何传递这个session ID呢。
如果cookie禁用后,我们通常可以通过URL重写和增加隐藏字段的方式来传输session ID,其原理就是在客户端所有请求里面都添加一个JSESSIONID的参数,服务端再通过获取这个参数来识别客户端的请求。这种方式虽然能解决sesion ID 传递的问题,但是在存在一些问题,所以很少使用。
4、Cookie 和sesion区别和关系
session安全性要高于cookieCookie是存储在客户端 Session是存储在服务端,客户端可以和操作Cookie但是无法操作session;虽然session ID也是存储在cookie里面的,但最多只会暴露出session ID,但把信息存储在cookie里面,一旦cookie 被窃取,那么意味着所有的信息都暴露了,。
Session会对服务器性能影响也正是由于session是存储在服务端的,而服务端面临的客户端是千千万万,而为每个客户端都保存一个session信息也无形之间增加了服务端的负荷,而cookie是存在客户端,这种压力就会被分摊到每个客户端。
Cookie 会增加网络传输的负荷每次http请求都会携带上cookie,而不论你的当前请求有没有用到cookie里的信息, 这样的话大量请求都会携带一些没有必要的信息,所以cookie里面的数据越大,无形中间额外增加了请求中不必要的数据传输,
Cookie 容量的限制Seesion 容量限制受制与服务器的配置,可以进行扩容,理论上是没有大小和个数限制的,而Cookie的大小是由浏览器限制的,不同浏览器的限制也不相同,所以我们没办法动态的扩充cookie的容量,使用cookie的时候要尽量避免数据过多超过浏览器限制则会丢失数据。
Session 和 cookie 相互依赖因为session ID 是通过cookie 来保存传输的,所以session的使用一定程度的依赖于cookie,在禁用cookie的情况下也会造成session无法正常使用,虽然有对应的解决方案,但是很少使用。
S}Y0§2 ��V