写点什么

【JavaWeb】会话的学习笔记:Cookie 和 Session 的知识点,这一次我总算学明白了

作者:游坦之
  • 2022-11-27
    山东
  • 本文字数:3565 字

    阅读完需:约 12 分钟

1 会话

1.1 什么是会话?

用户打开浏览器,访问 Web 服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

1.2 会话跟踪

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

1.3 为什么要会话跟踪?

Http 协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。

1.4 如何实现会话跟踪

  1. 客户端会话技术:Cookie

  2. 服务端会话跟踪技术:Session

2 Cookie

2.1 Cookie 的基本使用

2.1.1 发送 Cookie

2.1.1.1 核心方法

2.1.1.2 例子

@WebServlet("/demo01Cookie")public class CookieDemo01 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 1、设置Cookie */        Cookie cookie = new Cookie("username","zhangsan");
/* 2、发送Cookie */ resp.addCookie(cookie); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); }}
复制代码

2.1.1.3 效果

访问"demo01Cookie"


右键-检查-Application-Cookies 看到了手动发送的 Cookie


2.1.2 获取 Cookie

2.1.2.1 核心方法

2.1.2.2 例子

@WebServlet("/demo02Cookie")public class CookieDemo02 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 1、获取Cookies */        Cookie[] cookies = req.getCookies();        /* 2、遍历Cookies,获取自己想要的Cookie */        for (Cookie cookie : cookies) {            /* 3、获取cookie的名字 */            String name = cookie.getName();            if(name.equals("username"))            {                /* 4、获取cookie的值 */                String value = cookie.getValue();                System.out.println(name+":"+value);            }        }    }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码

2.1.2.3 效果

2.2 Cookie 的原理


Cookie 是基于 Http 协议的,服务器第一次访问 Servlet 的时候,Servlet 通过响应头 set-Cookie 将 Cookie 发送到浏览器,浏览器会自动 cookie 存放到 Cookie


Servlet 发送 Cookie



浏览器存放 Cookie


2.3 Cookie 的细节

2.3.1 Cookie 的生命周期

默认情况下,Cookie 在浏览器关闭之后就会自动消失。

2.3.1.1 设置 Cookie 的生命的周期


其中 expiry 的值有三种情况:


  • 正数:将 Cookie 写入电脑的硬盘,持久化存储,到时间子哦对那个删除

  • 负数:默认

  • 零:删除对应的 Cookie


2.3.2 Cookie 存储中文

默认情况下,是不支持存储中文的,甚至会报错,这里采用的方法是对字符串先转码再解码的方式存储中文。

2.3.2.1 核心方法

2.3.2.2 例子

发送 Cookie 端



@WebServlet("/demo01Cookie")public class CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* 1、设置Cookie */ /*Cookie cookie = new Cookie("username","zhangsan");*/ /* 1.1 对字符串转码 */ String value = "张三"; value = URLEncoder.encode(value,"UTF-8"); /* 1.2 设置Cookie */ Cookie cookie = new Cookie("username",value); System.out.println("value的值是:"+value);

/* 2、设置Cookie的生命周期(单位是s) */ /* 设置Cookie的生命周期是7天 */
cookie.setMaxAge(60*60*24*7);
/* 3、发送Cookie */ resp.addCookie(cookie); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); }}
复制代码


接受 Cookie 端


@WebServlet("/demo02Cookie")public class CookieDemo02 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 1、获取Cookies */        Cookie[] cookies = req.getCookies();        /* 2、遍历Cookies,获取自己想要的Cookie */        for (Cookie cookie : cookies) {            /* 3、获取cookie的名字 */            String name = cookie.getName();            if(name.equals("username"))            {                /* 4、获取cookie的值 */                String value = cookie.getValue();                System.out.println("获取的值是:"+value);                /* 4.1 解码 */                value = URLDecoder.decode(value,"UTF-8");                System.out.println(name+":"+value);            }        }    }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码

2.3.2.3 效果

3 Session

  • Session 是服务端会话跟踪技术:将数据保存在服务端

  • JavaEE 提供 HttpSession 接口,来实现依次会话的多次请求间数据共享的功能

3.1 Session 的使用

3.1.1 核心方法

3.1.2 例子

Session 是不需要发送的,因为 Session 本身就存放在服务端


设置 Session 的一端


@WebServlet("/Session01Demo")public class SessionDemo01 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 1、获取Session对象 */        HttpSession session = req.getSession();        /* 2、设置Session对象 */        session.setAttribute("username","zhangsan");

}
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码


获取 Session 的一段


@WebServlet("/Session02Demo")public class SessionDemo02 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 1、获取Session对象 */        HttpSession session = req.getSession();        /* 2、根据名字获取Session */        Object username = session.getAttribute("username");        session.removeAttribute("username");        System.out.println(username);    }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码

3.1.3 效果

3.2 Session 的原理

  • Session 是基于 Cookie 实现的

  • Session 有一个唯一的标识 Id


服务器请求 Servlet,Servlet 会自动生成一个 SessionID 并存在本地,并将这个 id 通过 set-cookie:JSESSIONID 发送到浏览器,浏览器存储在 Cookies 中,下一次浏览器访问 Servlet 的时候,会携带 JSESSIONID,Servlet 通过这个 Id 去本地文件查找 session。


3.3 Session 细节

3.3.1 Session 钝化、活化

  • 钝化: 在服务器正常关闭后,Tomcat 会自动将 Session 数据写入硬盘的文件中。

  • **活化:**再次启动服务器,从文件中加载数据到 Session 中

3.3.2 Session 的销毁

3.3.2.1 web.xml 配置

默认情况下,如果你没有任何操作,Session 会在 30 分钟后自动销毁。


<session-config>  <session-timeout>100</session-timeout></session-config>
复制代码


3.3.2.2 Invalidate 方法

调用 session.invalidate()方法销毁 Session


Session 销毁有什么用吗?


*再次启动服务器,从文件中加载数据到 Session 中

3.3.2 Session 的销毁

3.3.2.1 web.xml 配置

默认情况下,如果你没有任何操作,Session 会在 30 分钟后自动销毁。


<session-config>  <session-timeout>100</session-timeout></session-config>
复制代码


[外链图片转存中...(img-DlOIMn8T-1663206985748)]

3.3.2.2 Invalidate 方法

调用 session.invalidate()方法销毁 Session


Session 销毁有什么用吗?

Session 一般用在登录登出功能之上,Session 的销毁可以便于完成登出的功能!

用户头像

游坦之

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
【JavaWeb】会话的学习笔记:Cookie和Session的知识点,这一次我总算学明白了_javaWeb_游坦之_InfoQ写作社区