详解Session和cookie

1、cookie

1.1、 为什么会有cookie?

由于HTTP是无状态的,服务端并不记得你之前的状态。这种设计是为了HTTP协议的方便,但是也存在一些问题。比如我们登录一个购物网站,我们需要用户登录后才能进行物品的购买,但是由于HTTP无状态性,在你向服务端发起下一次请求的时候服务端并不会记得你之前登录过,所以服务端会要求客户再次登录;显然这样的用户体验是非常不好的,这个例子在我之前做购物网站的时候也遇见过。于是就引入了cookie来保存你的用户名、密码、浏览的网页等信息。当客户端要发送http请求时,浏览器会先检查下是否有对应的cookie。有的话,则自动地添加在request header中的cookie字段,然后服务端会判断cookie的内容是否正确或者是否过期。注意,每一次的http请求时,如果有cookie,浏览器都会自动带上cookie发送给服务端。

1.2、什么是cookie?

cookie是以小的文本文件形式(即纯文本),保存在本地内存中,完全存在于客户端;用来在服务端和客户端进行信息传递的,cookie保存了用户的登录的凭证,有了它,只需要在下次请求时带着cookie发送,就不必再重新输入用户名、密码等重新登录了。

第一次发起请求:

在这里插入图片描述

之后发起请求

在这里插入图片描述

1.3、查看cookie

在浏览器的控制台可以通过document.cookie来查看cookie,cookie是键值对构成的字符串,每个键值对是由分号隔开;也可以通过控制台的Application选项在左边查看cookie。

1.3、cookie的属性

每个cookie都有一定的属性,比如什么时候失效,要发送到哪个域名,哪个路径等等。

  • ExpiresMax Age:用来说明cookie什么时候失效
  • DomainPath:限制cookie能被哪些URL访问
  • Size:用来表示cookie的大小
  • Secure:设置cookie只在安全的请求中才会发送,比如在HTTPS请求中会发送,而在不安全的HTTP中不会发送
  • httpOnly:用来设置cookie是否能通过 js 去访问,只能通过服务端来设置。
    在这里插入图片描述
    如上图所示在HTTP选项中带勾的表示httpOnly

1.3、cookie的创建、读取、删除的方法

cookie既可以在服务端设置,也可以在客户端设置

1.3.1、在服务端设置

在服务端可以通过set-cookie来设置cookie,但是每个set-cookie只能存放一个cookie,并且服务端可以设置cookie 的所有选项。

1.3.2、在客户端设置

document.cookie = "name=cc"document.cookie = "sex:male",每次只能设置一个值,如何要设置多个cookie可以重复执行上面的操作。如果要删除cookie只需要把cookie的Expires改为-1表示该cookie已经过期。

1.4、cookie的优缺点

cookie的缺点:

  1. 每个特定域名下的cookie数量有限:

    IE6IE6-(IE6以下版本):最多20个cookie

    IE7IE7+(IE7以上版本):最多50个cookie

    FF:最多50个cookie

    Opera:最多30个cookie

    Chromesafari没有硬性限制

    当超过单个域名限制之后,再设置cookie,浏览器就会清除以前设置的cookie。IE和Opera会清理近期最少使用的cookie,FF会随机清理cookie;

  2. 存储量太小,只有4KB

  3. 每次HTTP请求都会发送到服务端,影响获取资源的效率;

  4. 需要自己封装获取、设置、删除cookie的方法;

2、session

与cookie不同session是保存在服务端

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

2.1、存取方式

Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

2.2、创建session

// 1、创建Session对象
HttpSession session = request.getSession(); 
// 2、创建Session对象
HttpSession session = request.getSession(true); 

2.3、session有效期

session一般在内存中存放,内存空间本身大小就有一定的局限性,因此session需要采用一种过期删除的机制来确保session信息不会一直累积,来防止内存溢出的发生。
session的超时时间可以通过maxInactiveInterval属性来设置。
如果我们想让session失效的话,也可以当通过调用session的invalidate()来完成。

session与cookie区别

cookie是存在客户端浏览器上,session会话存在服务器上。会话对象用来存储特定用户会话所需的属性及配置信息。当用户请求来自应用程序的web页时,如果该用户还没有会话,则服务器将自动创建一个会话对象。当会话过期或被放弃后,服务器将终止该会话。cookie和会话需要配合。当cookie失效、session过期时,就需要重新登录了。

3、localStorage和sessionStorage

在较高版本的浏览器中,js提供了两种存储方式:sessionStorageglobalStorage。在H5中,用localStorage取代了globalStorage

sessionStorage用于本地存储一个会话中的数据,这些数据只有在同一个会话中的页面才能访问,并且当会话结束后,数据也随之销毁。所以sessionStorage仅仅是会话级别的存储,而不是一种持久化的本地存储。

localStorage是持久化的本地存储,除非是通过js删除,或者清除浏览器缓存,否则数据是永远不会过期的。

参考:

猜你喜欢

转载自blog.csdn.net/weixin_43534005/article/details/88826813