【Java Web】Session和Cookie的学习之路


一、背景

会话(Session)用来跟踪用户的整个会话。常用的会话跟踪技术有:Session和Cookie。Cookie通过客户端记录信息确定用户身份,Session通过服务器端记录信息确认用户身份。

由于HTTP协议是一种无连接协议,也就是当一个客户向服务器发出请求,服务器接收请求,并返回响应后,该连接就结束了,而服务器不会保存相关的信息。 为了弥补这一缺陷,HTTP协议提供了session和cookie。

二、深入理解Session和Cookie

1.理解Session

理解session对象:
定义: session 是存储在服务器上的文本文件,并保留了用户的各种跟踪信息
作用: 会话保持,如完成用户的登录与状态保持,因为在服务器端,所以相对安全一些。

HttpSession 对象

  1. Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
  2. Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session会话。会话持续一个指定的时间段,跨多个连接或页面请求。
  3. 我们可以通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession对象,如下所示:
    在这里插入图片描述

Session对象被称为会话。通过session可以在应用程序的Web页面间进行跳转时,保存用户的状态,使整个会话一直存在下去,直到关闭浏览器,但是,如果在一个会话中,客户端长时间不向服务器发出请求,session对象就会消失。这个时间的长短取决于服务器,例如:Tomcat服务器默认时间是30分钟。不过这个时间可以通过编写程序进行修改。

实际上,一次会话的过程也可以理解为一个打电话的过程。通话从拿起电话或者手机拨号开始,一直到挂断电话结束,在这个过程中,可以与对方聊很多话题,甚至重复的话题。一个会话也是如此,可以重复访问相同的Web页。

Session什么时候被创建?
一个常见的误区是人们以为session再有客户端访问时被创建,事实上是直到有server端程序调用HttpServletRequest。getSession(true)这样的语句时才会被创建。

Session什么时候被删除?
(1)程序调用HttpSession.invalidate();
(2)距离上一次收到客户端发送的session id的时间超过了session的最大有效时间;
(3)服务器进程被停止。
需要注意的是 :关闭浏览器,只会使存储在客户端浏览器内的session cookie失效,而不会使服务端的session对象失效,除非服务端的session刚好也到了存在的截止时间。

2.理解Cookie

定义: Cookies 是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息;
作用: 会话保持,如完成用户的登录与状态保持;

cookie工作原理:

  • 客户端向服务区发起登录请求,服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
  • 浏览器将这些信息存储在本地计算机上,以备将来使用。
  • 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。

cookie构成:
Cookies 通常设置在 HTTP 头信息中。设置 Cookie 的http请求,会向 Servlet 会发送如下的头信息:
在这里插入图片描述

  • Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域。名称和值会被 URL 编码。
  • expires 字段是一个指令,告诉浏览器在给定的时间和日期之后过期(“忘记”)该 Cookie。
  • 如果浏览器被配置为存储 Cookies,它将会保留此信息直到到期日期。

Servlet 操作cookie方法:
获取静态网页,提交:
在这里插入图片描述

三、Session的工作流程

功能应用场景与cookie类似,用来存储少量的数据或者信息。
工作流程:

  1. 客户端向服务端发送请求时,看本地是否有cookie文件,如果有,就在HTTP的请求头(Request Headers)中,包含一行cookie信息;
  2. 服务器接收到请求时后,根据cookie信息,得到session id,根据session
    id找到对应的session,用这个session就能判断用户是否登录等等。

四、Cookie的应用场景

使用场景:十天免登录操作

实现:将用户的信息保存在客户端本地(和浏览器有关的本地路径下的,保存用户信息到本地文件),就相当于在本地客户端保存了一个文件,服务器可以通过响应浏览器的set-cookie的标头,得到cookie这个信息。当用户在某个网站注册后,就会受到唯一用户的ID的cookie,客户后来进行重新连接的时候,这个用户ID会自动返回,服务器对他进行检查,确定它是否为注册用户并且选择了自动登录,从而使用户需给出用户名和密码,就可以访问服务器的资源。并且自己可以给这个文件设置一个期限时间,这个期间时间,不会因为浏览器的关闭为消失。这个效果在许多的购物网站中体现得比较多,网站可以使用cookie记住用户的意愿,对于简单的设置**,网站可以直接将页面设置在cookie中完成定制。对于更为复杂的,网站只需仅将一个唯一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。**这样网站就可以通过你浏览的商品记住你的喜好,并且给你推荐你喜欢的东西。商家真的是太煞费苦心了!!!

五、Session和Cookie的区别

Session和Cookie的区别:
1.cookie数据存放在客户的浏览器上,session数据存放在服务器上。

2.session会在一定时间内保存在服务器上。当访问增多,会比较占用你的服务器的性能,考虑减轻服务器性能方面,应当使用cookie。

3.两个最大的区别在于:生命周期的不同。一个是IE启动到IE关闭。(浏览器一关闭,session就消失了),一个是预先设置的生命周期,或永久保存在本地的文件(cookie)。

六、Session、Cookie的生命周期

Session的生命周期:
当一个用户第一次访问服务器并被创建出来之后,只要用户继续访问,服务器就会更新session的最后访问时间。当有越来越多的用户访问服务器的时候,因此session也会越来越多,但为了防止内存溢出,服务器会把长时间内没有活跃的session从内存中删除,这个时间就是session存在的超时时间。如果超过了超时时间没有访问过服务器,session就自动失效了。

Cookie也存在长期和短期之分:cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge,则cookie的生命周期当浏览器关闭的时候,也就消失了。

在相同的一段时间内,cookie的生命周期是累计的,而session的生命周期是间隔的, 只要用户不断地访问session,那么session的存在时间就会不断的进行重新计算。

总结:
当用户关闭浏览器的时候,只是浏览器内存中的session和cookie消失,但不会把保存在服务端的session对象消失,同样不会使保存到硬盘上的持久化的cookie消失。

猜你喜欢

转载自blog.csdn.net/m0_46551861/article/details/114380334