计算机网络知识点——应用层Cookie与Session

Cookie与Session

Session原理

Session可以放在文件、内存中或数据库都可以,是以键值对的形式存储。Session也是一种key-value的属性对。

当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识,称为Session ID。如果已包含一个Session ID则说明以前已经为此客户端创建过Session,服务器就按照Session ID把这个Session检索出来使用(如果检索不到,可能会新建一个,根据 getSession()方法的参数);如果客户端请求不包含Session ID,则为此客户端创建一个 session并且生成一个与此Session相关联的Session ID,这个Session ID将被在本次响应中返回给客户端保存。

Session的客户端实现形式(即Session ID的保存方法)

一般浏览器通过以下3种方式来保存Session:

  1. 使用Cookie来保存。 来保存,这是最常见的方法,“记住我的登录状态”功能的实现正是基于这种方式的。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
  2. URL重写。就是把Session ID直接附加在URL路径的后面,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。
  3. 在页面表单里面增加隐藏域。这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。

Session何时被创建

一个常见的错误是以为Session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。

Session何时被删除

Session在下列情况下被删除:

  1. 程序调用HttpSession.invalidate();
  2. 距离上一次收到客户端发送的Session ID时间间隔超过了Session的最大有效时间;
  3. 服务器进程被停止。

再次注意关闭浏览器只会使存储在客户端浏览器内存中的Session、Cookie失效,不会使服务器端的Session对象失效。

getSession()/getSession(true)、getSession(false)的区别

getSession()/getSession(true):当Session存在时返回该Session,否则新建一个Session并返回该对象。

getSession(false):当Session存在时返回该Session,否则不会新建Session, 返回null。

Cookie的种类

  1. 以文件方式存在硬盘空间上的永久性的Cookie持久Cookie是指存放于客户端硬盘中的Cookie信息(设置了一定的有效期限),当用户访问某网站时,浏览器就会在本地硬盘上查找与该网站相关联的Cookie。如果该Cookie存在,浏览器就将它与页面请求一起通过HTTP报头信息发送到您的站点,然后在系统会比对Cookie中各属性和值是否与存放在服务器端的信息一致,并根据比对结果确定用户为“初访者”或者“老客户”。
  2. 停留在浏览器所占内存中的临时性Cookie关闭浏览器时即从计算机上删除。

Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒。

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。

如果maxAge属性为负数,为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的 Cookie,为临时性Cookie,Cookie信息保存在浏览器内存中,因此关闭浏览器该 Cookie就消失了。Cookie 默认的 maxAge值为–1。

如果 maxAge0,则表示删除该CookieCookie机制没有提供删除Cookie 的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie 会被浏览器从Cookie文件或者内存中删除。

Cookie的格式

Cookie在HTTP的头部信息中。

标准格式:Set -Cookie: NAME=VALUE;Expires=DATE;Path=PATH;

Domain=DOMAIN_NAME;SECURE;

举例说明:Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web;

Cookie的组成部分(主要内容)

Cookie的内容主要包括:名字,值,过期时间,域和路径。

Cookie的Expires属性标识了Cookie的有效时间,当 Cookie 的有效时间过了之后,这些数据就被自动删除了。若不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,关闭浏览器窗口,Cookie就消失。这种生命期为浏览器会话期的Cookie被称为会话Cookie(临时性Cookie),会话 cookie 保存在内存里。若设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。存储在硬盘上的 Cookie可以在不同的浏览器进程间共享,比如两个IE窗口。

Cookie的域和路径属性一起构成Cookie的作用范围。Domain属性可以使多个Web服务器共享Cookie。Path指定与Cookie关联在一起的网页。

Cookie被浏览器禁用怎么办

Cookie可以被人为的禁止,则必须有以下其他机制以便在Cookie被禁止时仍然能够把Session ID传回服务器。

  1. URL重写。
  2. 在页面表单里增加隐藏域。

Cookie与Session原理解析

客户第一次发送请求给服务器,此时服务器产生一个唯一的Session ID,并返回给客户(通过Cookie),此时的Cookie并没有设置setMaxAge();只是保存于客户端的内存中,并与一个浏览器窗口对应着,由于HTTP协议的特性,这一次连接就断开了。以后此客户端再发送请求给服务器的时候,就会在请求request中携带 Cookie,由于Cookie中有Session ID,所以服务器就知道这是刚才那个客户,从而区分不同的人,购物车就是这样实现的。

第一次请求时:(注意,访问JSP时会自动创建Session ID,而访问Servlet,需要你自己写代码才会创建Session ID)。

Cookie与Session的区别

  1. Cookie数据存放在客户端,用来记录用户信息的,Session数据存放在服务器上。
  2. Cookie安全性不够。正式由于Cookie存储在客户端中,对客户端是可见的,客户端的一些程序可能会窥探、复制甚至修改Cookie中的内容,并进行Cookie欺骗。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的危险,因此较为安全。如果选用Cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只有自己能读得懂。而如果选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以。
  3. Session是保存在服务器端的,每个用户都会产生一个Session。如果并发访问的用户非常多,会产生非常多的Session,消耗大量的服务器内存。因此像 Google、Baidu这样并发访问量极高的网站,是不太可能使用Session来追踪客户会话的。Cookie性能更高一些,因为Cookie保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,Cookie是很好的选择。对于Google、Baidu、Sina来说,Cookie也许是唯一的选择。
  4. Cookie的容量和个数都有限制。单个Cookie的容量不能超过4KB,很多浏览器都限制一个站点最多保存20个Cookie,而Session没有此问题。
  5. 所以个人建议:将登录信息等重要信息存放到Session中,其他信息如果需要保留,可以放在Cookie中。

Session和Cache的区别

Session是单用户的会话状态。当用户访问网站时,产生一个Session ID。并存在于Cookie中。每次向服务器请求时,发送这个Cookie,再从服务器中检索是否有这个Session ID保存的数据。而Cache则是 服务器端的缓存,是所有用户都可以访问和共享的。因为从Cache中读数据比较快,所以有些系统(网站)会把一些经常被使用的数据放到Cache里,提高访问速度,优化系统性能。

如果有几千个Session,怎么提高效率。当Session访问量比较大的时候,怎么解决?

把Session放到redis或memcache等此类内存缓存中或着把Session存储在SSD硬盘上。

猜你喜欢

转载自blog.csdn.net/weixin_36378917/article/details/81148920