顶级架构师学习——第十二阶段:来谈谈Cookie和Session趴

都说我很勤奋的!!!

目录

Part One:哈是Cookie?

Part Two:发送&接收Cookie

Part Three:不要打扰我的Session

Part Four:怎么 US Session?

Part Five:Summary


Part One:哈是Cookie?

简单的说,Cookie技术是将用户的数据存储到客户端的技术。当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息存储在Cookie当中。这样,当该浏览器再次访问服务器时,Cookie中的数据会包含在请求头当中,方便服务器做出响应。

Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies会话Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称作 Persistent Cookies持久化Cookies)。

通常情况下,当用户结束浏览器会话时,系统将终止所有的 Cookie。当 Web 服务器创建了Cookies 后,只要在其有效期内,当用户访问同一个 Web 服务器时,浏览器首先要检查本地的Cookies,并将其原样发送给 Web 服务器。这种状态信息称作“Persistent Client State HTTP Cookie” ,简称为 Cookies。

Part Two:发送&接收Cookie

1.服务器端向客户端发送一个Cookie

当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie形式发给浏览器。一旦用户接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲区中,这样当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie形式发送给Web服务器,从而使服务器能够分辨当前请求由哪个用户发出。 

1)创建Cookie:

Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:

Cookie cookie = new Cookie("username","zhangsan");

那么该cookie会以响应头的形式发送给客户端。

注意:Cookie中不能存储中文!

2)设置Cookie在客户端的持久化时间:

cookie.setMaxAge(int seconds); ---时间秒

注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里

示例:

cookie.setMaxAge(10*60);

设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期后浏览器自动删除该cookie信息

3)设置Cookie的携带路径:

cookie.setPath(String path);

注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的 web资源所在的路径都携带cookie信息

示例:

cookie.setPath("/WEB16");

代表访问WEB16应用中的任何资源都携带cookie

cookie.setPath("/WEB16/cookieServlet");

代表访问WEB16中的cookieServlet时才携带cookie信息

4)向客户端发送cookie:

response.addCookie(Cookie cookie);  两次添加的Cookie的名称若相同,后者会覆盖前者

5)删除客户端的cookie:

如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

2.服务器端接受客户端携带的Cookie

cookie信息以请求头的方式发送到服务器端。

1)通过request获得所有的Cookie:

Cookie[] cookies = request.getCookies();

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

for(Cookie cookie : cookies){

    if(cookie.getName().equal(cookieName)){

        String cookieValue = cookie.getValue();

    }

}

3.Cookie常用的API

Part Three:不要打扰我的Session

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID。

在上图中,用户甲和乙都调用 buyservlet将商品添加到购物车,调用 pay Servlet进行商品结算。由于甲和乙购买商品的过程类似,在此,以用户甲为例进行详细说明。当用户甲访问购物网站时,服务器为甲创建了一个 Session对象(相当于购物车)。当甲将 Nokia手机添加到购物车时,Nokia手机的信息便存放到了 Session对象中。同时,服务器将 Session对象的D属性以 Cookie( Set-cookie: JSESSIONID=111的形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头中将 Cookie( Cookie: JSESSIONID=11信息回送给服务器,服务器根据D属性找到为用户甲所创建的 Session对象,并将 Session对象中所存放的 Nokia手机信息取出进行结算。

我们可能会问,有Cookie,那为什么还要使用Session?

那是因为Cookie是有大小和数量限制的,而且相对而言,Cookie没有Session安全。

而且,当我们使用Session时,多个请求用户可以共享一个资源。

Part Four:怎么 US Session?

1.获得Session对象

HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)

2.怎样向session中存取数据(session也是一个域对象)

Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

session.setAttribute(String name,Object obj);

session.getAttribute(String name);

session.removeAttribute(String name);

3.Session对象的生命周期(面试题/笔试题)

创建:第一次执行request.getSession()时创建

销毁:

  1. 服务器(非正常)关闭时
  2. session过期/失效(默认30分钟)

问题:时间的起算点 从何时开始计算30分钟?

答:从不操作服务器端的资源开始计时

过期时间可以在工程的web.xml中进行配置

<session-config>

        <session-timeout>30</session-timeout>

</session-config>

我们也可以手动销毁session

session.invalidate();

作用范围:

默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象

Part Five:Summary

Cookie技术:存到客户端

1.发送cookie

Cookie cookie = new Cookie(name,value)

cookie.setMaxAge(秒)

cookie.setPath()

response.addCookie(cookie)

2.获得cookie

Cookie[] cookies = request.getCookies();

cookie.getName();

cookie.getValue();

Session技术:存到服务器端借助cookie存储JSESSIONID

HttpSession session = request.getSession();

setAttribute(name,value);

getAttribute(name);

session生命周期

创建:第一次指定request.getSession();

销毁:服务器关闭、session失效/过期、手动session.invalidate();

session作用范围:默认在一个会话中


今天的复习就到这里,我是小昶,我们下次再见(′,,•ω•,,‘)

猜你喜欢

转载自blog.csdn.net/qq_39391192/article/details/86824144