Servlet会话:Cookie和Session

会话技术,在了解cookie和session之前,需要先了解一个概念:会话

1. 概念

在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。web应用中的会话过程类似于生活中的打电话过程,它指的是客户端(浏览器)与web服务器之间连续发生的一系列请求和响应的过程。例如:一个用户在某个网站上的整个购物过程就是一个会话。


2. HttpServletRequest对象和ServletContext

HttpServletRequest对象和ServletContext都可以对数据进行保存,但是针对下面所描述的需求就不可行:

用户甲和乙分别登录购物网站,甲在购物车中添加了一个iphone手机,乙在购物车中添加了一个Ipad平板,这时web服务器需要对用户甲和用户乙的信息分别进行保存。

HttpServletRequest对象存储为什么不能实现该需求呢?

客户端请求web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买的数据会丢失。

ServletContext对象为什么不能实现改需求呢

使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中的所有用户购买的商品进行结算,这显然也是不行的。

Cookie和Session

为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

3. 会话跟踪

Cookie

1. 概念

        当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。      

传输过程可用如下图表示:

Servlet会话:Cookie和Session

如上图:Cookie的工作原理可这样描述

1)首先浏览器向服务器发出请求。

2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。

3)然后把该Cookie对象放在响应头,一并发送回浏览器。

4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。

5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。

6)服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。
 

Session

1. Session概念

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
注意:由于客户端需要接受、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
过程如下:
 

Servlet会话:Cookie和Session

那么Session技术的原理是什么,它是如何工作的呢?

1)浏览器发出请求到服务器。
2)服务器会根据需求生成Session对象,并且给这个Session对象一个编号,一个编号对应一个Session对象
3)服务器把需要记录的数据封装到这个Session对象里,然后把这个Session对象保存下来。
4)服务器把这个Session对象的编号放到一个Cookie里,随着响应发送给浏览器
5)浏览器接收到这个cookie就会保存下来
6)当下一次浏览器再次请求该服务器服务,就会发送该Cookie
7)服务器得到这个Cookie,取出它的内容,它的内容就是一个Session的编号!!!
8)凭借这个Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!
 

Cookie和Session
1. Cookie和Session的区别

从存储方式上比较

    Cookie只能存储字符串,如果要存储非ASCII字符串还要对其编码; Session可以存储任何类型的数据,可以把Session看成是一个容器
    cookie数据存放在客户的浏览器上,session数据放在服务器上;
    单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

从隐私安全上比较

    Cookie存储在浏览器中,对客户端是可见的。信息容易泄露出去。如果使用Cookie,最好将Cookie加密
    Session存储在服务器上,对客户端是透明的。不存在敏感信息泄露问题。

从有效期上比较

    Cookie保存在硬盘中,只需要设置maxAge属性为比较大的正整数,即使关闭浏览器,Cookie还是存在的
    Session的保存在服务器中,设置maxInactiveInterval属性值来确定Session的有效期。并且Session依赖于名为JSESSIONID的Cookie,该Cookie默认的maxAge属性为-1。如果关闭了浏览器,该Session虽然没有从服务器中消亡,但也就失效了。

从对服务器的负担比较

    Session是保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存。
    Cookie是保存在客户端的。不占用服务器的资源。像baidu、Sina这样的大型网站,一般都是使用Cookie来进行会话跟踪。

从浏览器的支持上比较

    如果浏览器禁用了Cookie,那么Cookie是无用的了!
    如果浏览器禁用了Cookie,Session可以通过URL地址重写来进行会话跟踪。

从跨域名上比较

    Cookie可以设置domain属性来实现跨域名
    Session只在当前的域名内有效,不可夸域名

2. Session和Cookie共同使用

暂无
 

参考资料:

Servlet Cookie 处理

https://www.runoob.com/servlet/servlet-cookies-handling.html

 

Servlet之Cookie和Session

https://blog.****.net/li_li_lin/article/details/80714372