会话跟踪技术——Session与Cookie

499 阅读3分钟

    我们知道服务器与客户端之间的协议通信一般来说是Http协议。而Http协议是无状态的。
Http无状态:即当两个客户端向服务器发送请求时,客户端a先发送第一个请求,客户端b接着再发一个请求,此时由于Http的这个特性导致服务器无法判断这两次的请求是不是同一客户端发送而来)

  这也带来了一个很现实的问题:假如我们是在购物的过程中呢?第一次请求时添加商品到购物车,第二次请求时结账,而如果服务器无法判断这些操作是同一个用户发送的,我们结账是不是就会出现帮别人结账的问题?

  因此为了解决这个无状态的问题会话跟踪技术应运而生。

Session会话跟踪技术

  客户端第一次发送请求给服务器,服务器获取session,获取不到,则会创建新的session,然后响应给客户端,当下次客户端给服务器发送请求时,会把sessionID带给服务器,那么服务器就能获取到了,服务器就会判断这一次请求和上次某次的请求是否是同一个客户端,进而能够区分开客户端。

  通俗讲就是一个脸盲收银员,每次顾客来不知道是不是上次某次来过的客户,但是脸盲收银员会分配一个号码给这些顾客,下次他们来的时候,看见号码脸盲收银员就知道是谁了。

image.png

这解释下什么是sesion的非激活间隔时长:假如某一个页面,你在规定时间内没有进行任何有效操作,它就会告诉你会话已失效,那么这段时间就是非激活间隔时长。就是像我们充值时候下面有个读秒,过了读秒提示你页面已失效,要你重新获取。这个读秒的时长就是这里所谓的非激活间隔时长,说的这么高大上其实就是这么个意思。

session保存作用域:

image.png

无论这两个组件是不是相同的,都可以通过一个key去获取值,session保存作用域是和某个具体session对应。

image.png

如果出现key相同的容器,那么它的value就会覆盖之前key的value。

Cookie会话跟踪技术

Cookie会话技术是将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

image.png

获取客户端携带的所有Cookie,我们一般使用request对象:

Cookie[] cookie = request.getCookies();

 for(Cookie cookie:cookies){
     //获取数据
     String name = cookie.getName();
     if("username".equals(name)){
         String value = cookie.getValue();
         System.out.println(name + ":" + value);
         break;
     }
 }

image.png

image.png

需要注意的是:

Cookie不能直接存储中文,如需要存储中文则需要进行转码:URL编码

image.png

Cookie与Session的区别

1.存储位置:Cookie是将数据存储在客户端,而Session则将数据存储在服务端
2.安全性:由于客户端每次访问服务器时,都会将Cookie携带发送到服务器,因此Cookie是不安全的,而Session则更为安全
3.数据大小:Cookie最大3kb,Session无大小限制
4.存储时间:Cookie可以长期存储,而Session默认为30分钟
5.服务器性能:Cookie不占用服务器资源,Session占用服务器资源。

在我们选择使用Cookie或是Session时,要按照他们的特点来结合实际情况选择使用