Cookie和Session

本文深入探讨了会话管理在Web应用中的核心作用,包括会话的定义、有状态会话的概念,以及Cookie和Session这两种主要的会话保存技术。详细解释了Cookie作为客户端技术的工作原理,以及Session作为服务器端技术如何保持用户会话状态。对比分析了Cookie和Session的存储位置、使用场景和设置方式,为读者提供了全面的会话管理知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

       一、会话

       二、保存会话的两种技术

       三、Cookie

        四、Session

        五、Session和Cookie的区别


一、会话

1. 会话定义

  • 会话是指一个终端用户与交互系统进行通讯的过程,比如用户打开一个浏览器,点击很多超链接,访问了许多的web资源,然后关闭浏览器,这就是一个会话过程。

2. 有状态会话:用户访问过一次,下次再来时服务端知道它曾经来过。

  • 如何证明你是某学校的学生

你        学校

1. 发票:学校给你开一张缴费发票,证明你报名入学

2.登记:通过花名册,学校标记你是本校学生

  • 如何证明一个网站你来过

客户端      服务器

1.服务端给客户端一个信件(Cookie),客户端下次访问服务端带上信件即可

2.服务器登记(Session)你来过了,下次来的时候可以匹配你

二、保存会话的两种技术

1. Cookie

  • 客户端技术
  • 保存了该客户机访问这个Web 文档时的信息
  • 当客户机再次访问这个 Web 文档时这些信息可供该文档使用
  • 储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存

2. Session

  • 服务器技术
  • Session对象存储特定用户会话所需的属性及配置信息
  • 当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去
  • 当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象
  • 当会话过期或被放弃后,服务器将终止该会话

3.常见情形:网站登陆后,下次不需要再登录,直接就可以访问了。

三、Cookie

  1. Cookie和域名相关(不同的域名,cookie不同)
  2. 一般是保存用户的身份信息(身份不同,cookie不同)
  3. 保存位置在客户端本地文件夹(跟浏览器相关) 
package 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;

//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你,你来的时间,把这个时间封装成一个信件,下次来的时候只需要带上即可

        //初始化设置中文编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        PrintWriter out = resp.getWriter();
        //Cookie,服务端从客户端获得
        //这里返回数组,说明可以存在多个Cookie
        Cookie[] cookies = req.getCookies();

        //判断Cookie是否存在
        if (cookies != null){
            //cookie存在
            out.write("上次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie名字
                if (cookie.getName().equals("LastLoginTime")){
                    //获取cookie的值
                    long LastLoginTime =  Long.parseLong(cookie.getValue());
                    Date date = new Date(LastLoginTime);
                    out.write(date.toLocaleString());
                }
            }
        }else{
            out.write("这是第一次访问");
        }


        //服务器给客户端响应一个cookie
        Cookie cookie  = new Cookie("LastLoginTime",System.currentTimeMillis()+"");
        resp.addCookie(cookie);

    }
}
  • Cookie[] cookies = req.getCookies();    //获得cookie
  • cookie.getName();   //获取cookie名字
  • cookie.getValue();   //获取cookie的值
  • Cookie cookie = new Cookie();   //新建一个cookie
  • cookie.setMaxAge();    //设置cookie有效期
  • resp.addCookie(cookie);    //响应给客户端一个cookie
  • 如果要使cookie保存中文的信息,需要使用java.net.URLEncoder类的encode方法进行编码

一些细节:

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

删除cookie

  • 不设置有效期,关闭浏览信息后,会自动失效
  • 设置有效期时间为0
package 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;

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有效期设为0,立马过期
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
        
    }
}

四、Session

  • session表示一次会话
  • session是服务端保存属于的一种实现 
package servlet;

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

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","小花");

        //获取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("SESSIONID",sessionId);
        resp.addCookie(cookie);
    }

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

一些细节

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

注销session

  • 手动注销
package servlet;

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

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
  • 在web.xml中设置自动注销
<!--设置session的失效时间-->
<session-config>
    <!--10分钟后session自动失效,以分钟为单位-->
    <session-timeout>10</session-timeout>
</session-config>

五、Session和Cookie的区别

为什么经常把session和cookie联系起来?

  • 因为session的实现方式有很多种,其中就可以用cookie来实现session。
 cookiesession
存储位置保存在客户端本地磁盘中保存在服务端的一种实现
使用场景登录时的“记住我”,“xx天免登录”,即浏览器关闭后重新打开仍可以使用同一个浏览器,同一个登录入口进来,在调用其他url服务时,不需要再次输入用户名密码
设置方式浏览器将cookie以键值对的形式保存到某个目录下的文本文件内由具体的服务器实现或程序自行实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值