Cookie、Session

1.会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,到关闭浏览器为止,这个过程可以称之为会话。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话。

你怎么证明你是北大的学生

你:1.发票  2.学校登记

北大:1.北大给你开发票  2.北大标记你来过

一个网站怎么证明你来过

客户端:1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了  2.服务器登记你来过,下次你来的时候我匹配你

服务端:1.cookie  2.session

2.保存会话的两种技术

在一次会话中往往会产生一些数据,而这些数据往往是需要我们保存起来的,如何保存会话中产生的这些数据呢?

  • 比如:在购物过程中,将商品加入购物车,其实就是将商品信息保存到数据库中
  • 如果没有登录,将商品假如购物车,其实就是将商品信息保存到了cookie或者session中

cookie:客户端技术(响应,请求)

session:服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中

常见现象:网站登录后,下次就不用登录了,第二次访问直接就登录上去了

3.Cookie的简单说明

从请求中拿到cookie信息

服务器响应给客户端cookie

 1 //获取Cookie
 2 Cookies[] cookies = req.getCookies();
 3 //获取Cookie中的key
 4 cookies.getName();
 5 //获取Cookie中的value
 6 cookies.getValue();
 7 //新建一个cookie
 8 new Cookie("lastLoginTime",System.currentTimeMillis()+"");
 9 //设置cookie的有效期
10 cookies.setMaxAge(24*60*60);
11 //响应给客户端一个cookie
12 resp.addCookie(cookie);

 cookie:一般会保存在本地的用户目录下appdate

4.cookie的工作原理

  1. cookie是将会话中产生的数据保存在客户端,是客户端技术
  2. cookie是基于两个头进行工作的:分别是set-cookie响应头和cookie请求头
  3. 通过set-cookie响应头将cookie从服务器端发送给浏览器,让浏览器保存到内部,浏览器一旦保存了cookie,以后浏览器每次访问服务器时,都会通过cookie请求头,将cookie信息带回到服务器中,在需要时,在服务端可以获取请求中cookie中的数据,从而实现某些功能。

 5.cookie的API及应用

1.创建cookie对象

1 //创建cookie的同时需要制定cookie的名字和cookie要保存的值
2 Cookie c = new Cookie(String name,String value);

2.将cookie添加到response响应中

1 //将cookie添加到响应中,由服务器负责将cookie信息发送给浏览器,再由浏览器保存到内部(可以多次调用该方法,添加一个以上的cookie)
2 response.addCookie(Cookie c);

3.获取请求中的所有cookie对象组成的数组

1 //获取请求中携带的所有cookie组成的cookie对象数组,如果请求中没有携带任何cookie,调用该方法会返回null
2 Cookie[] cs = request.getCookies();

4.删除浏览器中的cookie

 1 //cookie的API中没有直接删除cookie的方法,可以通过别的方法间接删除cookie
 2 //删除名为cart的cookie:可以向浏览器在发送一个同名的cookie(即名称也
 3 //叫作cart),并设置cookie的最大生存时间为0,由于浏览器是根据cookie的
 4 //名字来区分cookie,如果前后两次向浏览器发送同名的cookie,后发送的
 5 //cookie会覆盖之前发送的cookie。而后发送的cookie设置了生存时间为0,因
 6 //此浏览器收到后会立即删除!
 7 //################################
 8 //创建一个名称为cart的cookie
 9 Cookie c = new Cookie("cart","");
10 //设置cookie的最大生存时间为0
11 c.setMaxAge(0);
12 //将cookie添加到响应中,发送给浏览器
13 response.addCookie(c);
14 out.write("成功删除了cart的cookie");

5.cookie的常用方法

1 //获取cookie的名字
2 cookie.getName();
3 //获取cookie中保存的值
4 cookie.getValue();
5 //设置、修改cookie中保存的值(没有setName方法,cookie的名字无法修改)
6 cookie.setValue(0;
7 //设置cookie的最大生存时间
8 cookie.setMaxAge();

6.setMaxAge方法:设置cookie的最大生存时间

 1 //如果不设置该方法,cookie会默认是会话级别的cookie,即生存时间为一次会话。当浏览器关闭,会话结束,cookie也会被销毁
 2 //cookie默认存在浏览器内存中,内存释放,cookie也会随着内存的释放而销毁
 3 //如果设置了该方法,cookie将不会保存到浏览器内存中,而是以文件形式保存到浏览器的临时文件夹中(也就是硬盘上),这样关闭浏览器,内存释放,保存到硬盘上的cookie文件不会销毁,再次打开浏览器,还可以获取硬盘上的cookie信息
 4 //###############################
 5 //创建一个cookie对象,将商品信息保存到cooke中
 6 Cookie cookie = new Cookie("cart",prod);
 7 //设置cookie最大生存时间,单位秒
 8 cookie.setMaxAge(60*60*24);
 9 //将cookie对象添加到response响应中
10 response.addCookie(cookie);

一个网站cookie是否存在上限

  • 一个网站cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小有限制4kb
  • 300个cookie浏览器上限

编码解码

1 //编码
2 URLEncoder.encode("dz","utf-8")
3 //解码
4 URLDecoder.decode(cookie.getvalue(),"UTF-8")

6.使用cookie模拟购物车

1.index.html

 1 ...
 2 <body>
 3     <h3>点击下面的商品链接, 可以将商品加入购物车</h3>
 4     <!-- 
 5     http://localhost/day13-cookie/CartServlet
 6     http://localhost/day13-cookie/index.html
 7      -->
 8     <p><a href="CartServlet?prod=iphone11">iphone11</a></p>
 9     <p><a href="CartServlet?prod=vivonex3">vivonex3</a></p>
10     <p><a href="CartServlet?prod=xiaomishouji">xiaomishouji</a></p>
11     <p><a href="CartServlet?prod=huaweip30">huaweip30</a></p>
12     <p><a href="CartServlet?prod=海尔洗衣机">海尔洗衣机</a></p>
13     
14     <h3>点击下面的支付链接, 可以对购物车中的商品进行结算</h3>
15     <a href="PayServlet">支付</a>
16 </body>
17 ...

2.CartServlet

 1 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 2         throws ServletException, IOException {
 3     response.setContentType("text/html;charset=utf-8");
 4     PrintWriter out = response.getWriter();
 5     //-------------------------------------------------------
 6     //获取请求中携带的商品信息(将要加入购物车的商品信息)
 7     String prod = request.getParameter("prod");
 8     //创建一个Cookie对象,将商品信息保存到cookie中
 9     Cookie cookie = new Cookie("cart",prod);
10     //设置cookie的最大生存时间, 单位:秒
11     cookie.setMaxAge( 60*60*24 );
12     //将cookie对象添加到response响应中
13     response.addCookie( cookie );
14     //做出回应
15     out.write( "成功将"+prod+"加入了购物车....." );
16 }

3.PayServlet

 1 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 2         throws ServletException, IOException {
 3     response.setContentType("text/html;charset=utf-8");
 4     PrintWriter out = response.getWriter();
 5     //------------------------------------------------------
 6     //获取请求中的所有cookie信息(null/cookie数组)
 7     Cookie[] cs = request.getCookies();
 8     //遍历所有cookie数组, 找出名称为cart的cookie
 9     String prod = null;
10     if( cs != null ) {
11         for (Cookie c : cs) {
12             if( "cart".equals( c.getName() ) ) {
13                 //获取cookie中保存的商品信息
14                 prod = c.getValue();
15             }
16         }
17     }
18     //为商品进行结算
19     if( prod == null ) {
20         out.write( "您还没有将商品加入购物车...." );
21     }else {
22         out.write( "成功为"+prod+"支付了1000.00元...." );
23     }
24 }

 7.Session的简单说明

 

 什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
  • 用户登录之后,整个网站它都可以访问--->保存用户的信息,保存购物车的信息

Session和cookie的区别

  • Cookie是把用户的数据写给用户的浏览器。浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务创建

使用场景

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存在Session中

8.Session的工作原理

 

  1.  Session是将会话中产生的数据保存在服务器端,是服务器端技术
  2. Session是一个域对象,session中保存了一个map集合,往session中存数据,其实是将数据保存在session的map集合中
  3. 通过session.setAttribute()方法可以将数据保存到session中,通过session.getAttribute()方法可以将数据从session中取出来

session是一个域对象

获取session对象

1 //获取一个session对象
2 //如果在服务器内部有当前浏览器对应的session,则直接返回该session对象
3 //如果没有对应的session,则会创建一个新的session对象再返回
4 request.getSession();

 

session是一个域对象,因此session中也提供了存取数据的方法

1 //往session域中添加一个域属性,属性名只能是字符串类型,属性值可以使任意类型
2 session.setAttribute(String attrName,Object attrValue);
3 //根据属性名获取域中的属性值,返回值是一个object类型
4 session.getAttribute(String attrName);

session域对象的三大特征

1.生命周期

创建session:第一次调用request.getSession()方法,就会创建一个session对象(当浏览器在服务器端没有对应的session时,调用request,getSession()方法服务器会创建一个session对象)

销毁session:

  1. 超时销毁:默认情况下,当超过30分钟没有访问session,session就会超时销毁。(30分钟是默认时间,可以修改,但是不推荐修改)
  2. 自杀:调用session的invalidate方法时,会立刻销毁session
  3. 意外身亡:当服务器非正常关闭时(硬件损坏,断电,内存溢出等导致服务器非正常关闭),session会随着服务器的关闭而销毁;当服务器正常关闭时,在关闭之前,服务器会将内部的session对象序列化保存到服务器的work目录下,变为一个文件,这个活成叫session的钝化(序列化),再次将服务器启动起来,钝化着的session会再次回到服务器,变为服务器中的对象,这个过程叫做session的活化(反序列化)。

2.作用范围:在一次会话的范围内(获取到的都是同一个session对象)

3.主要功能:在整个会话范围内实现数据的共享

 

呆毛

posted @ 2020-08-22 11:20  罗晓峥  阅读(182)  评论(0编辑  收藏  举报