JavaWeb----Cookie和Session的异同

前言

谈到Cookie和Session,我们就得先了解一下会话这个概念。那么网络上的一次会话定义是什么呢?
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为会话。
有状态会话:给一次会话加上标志位,证明他来过。举一个现实生活中的例子,一个同学来到教室,下次同学再来教室,我们就知道这个同学曾经来过,这就称之为有状态会话。

每篇无奖问答:
我们该如何证明你是某个学校的学生呢?
你 学校
这其实无外乎两种方式:一种是学校给你一张缴费单,上面有你的相关信息,你进入学校后,可以把它作为你身份的凭证。
另外一种是学校对你的信息进行登记,就像你在班级里都有一个固定的学号信息,这就是你身份的·凭证。
继续思考一下,一个网站又如何证明你来过呢(类比学校和你的关系)
客户端 服务器

  1. 服务端给客户端一个信件(类似于缴费单),客户端下次访问服务器带上信件就可以了。(这就是所谓的cookie)
  2. 服务端登记你来过(相当月学号信息),下次你来的时候我来匹配你。(这就是所谓的session)

上面的例子我们可以做出如下总结:
网络上保存会话有两种技术:
Cookie : 客户端技术 (响应,请求)
Session: 服务端技术,利用这个技术,可以保存用户的会话信息。
常用场景:网站登录之后,你下次不用再登录,第二次直接就登上去了。

1. Cookie

在这里插入图片描述
用户第二次可以免登陆的原因:
[1] 服务器 从客户端的请求中拿到cookie信息
[2] 服务端响应客户端的cookie信息

Cookie的主要方法
(其中req表示request对象,resp表示response对象)

Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName();                    //获得cookie中的key
Cookie cookie  = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie对象
cookie.setMaxAge(24*60*60);          //设置cookie的有效期
resp.addCookie(cookie);              //响应给客户端一个cookie

以一个设置cookie的有效期为例子

package com.gs.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * @Auther: Gs
 * @Date: 2020/5/16
 * @Description: PACKAGE_NAME
 * @version: 1.0
 */
public class CookieDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //服务器给客户端响应一个Cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //cookie有效期为1天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

记得写完cookie后都要进行注册,因为它本质上是一个Servlet类
在web.xml上进行注册

<servlet>
    <servlet-name>CookieDemo02</servlet-name>
    <servlet-class>com.gs.servlet.CookieDemo02</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>CookieDemo02</servlet-name>
    <url-pattern>/cookie2</url-pattern>
</servlet-mapping>

这样cookie的信息就可以保存一天了。
思考:一个网站的cookie是否存在上限?

  • 一个Cookie只能保存一个信息
  • 一个Web站点可以给浏览器发送多个cookie, 最多存放20个cookie(关于这个web站点的,其他站点分开累积)
  • Cookie信息大小限制为4kb
  • 300个 cookie为浏览器的上限

删除Cookie

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效时间为0

2. Session

在这里插入图片描述
什么是Session?

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

使用场景:

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

Session 和Cookie的区别:

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

Session的使用:(本质上也是同一个Servlet)

package com.gs.servlet;

import com.gs.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

/**
 * @Auther: Gs
 * @Date: 2020/5/16
 * @Description: com.gs.servlet
 * @version: 1.0
 */
public class SessionDemo01 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         //解决乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到session
        HttpSession session = req.getSession();
        //在session中存东西
        session.setAttribute("name",new Person("张三",18));
        //获取session的ID
        String sessionId = session.getId();

        //判断session是不是新创建的
        if(session.isNew()){
            resp.getWriter().write("session创建成功,Id:"+sessionId);
        }else {
            resp.getWriter().write("session已经在服务中存在了,ID:"+sessionId);
        }

        //session创建的时候做了什么事情
        //Cookie cookie = new Cookie("JSESSIONID", sessionId);
        //resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

其他的使用说明:
session可以存放对象,可以手动注销,也可以移除某个key
(其中Person是一个实体对象)

HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());

session.removeAttribute("name");
//手动注销session
session.invalidate();

上面的Session类写完记得在web.xml中注册

<servlet>
    <servlet-name>SessionDemo01</servlet-name>
    <servlet-class>com.gs.servlet.SessionDemo01</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>SessionDemo01</servlet-name>
    <url-pattern>/s1</url-pattern>
</servlet-mapping>

我们不仅能在 Servlet类对Session的值进行设置,还可以在web.xml中进行设置
比如:设置会话自动过期

<!--设置session默认的失效时间-->
<session-config>
    <!--1分钟后session自动失效,以分钟为单位-->
    <session-timeout>1</session-timeout>
</session-config>

小结:

以上就是Sesion和Cookie的全部内容,其实这两者的本质都是键值对,只不过Cookie是客户端的行为,Session是服务器的行为。而且Cookie的value值只能是字符串,而Session则是Object,所以Session在我们日常开发中使用较为广泛。
下面是关于我们浏览器中保存的Cookie值,(我们每个人通过审查元素都能看到浏览器对于我们会话的保存)
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章