会话会话会话

news2024/11/18 15:26:16

目录

1.会话

1.1 为什么需要会话控制

1.2 域对象的范围

1.2.1 应用域的范围

1.2.2 请求域的范围

1.2.3 会话域的范围

1.3 Cookie技术

1.3.1 Cookie的概念

1.3.2 Cookie的作用

1.3.3 Cookie的应用场景

1.3.4 Cookie的入门案例

① 目标

② Cookie相关的API

③ ServletDemo01代码

④ 浏览器发送请求携带Cookie

⑤ ServletDemo02获取Cookie数据的代码

1.3.5 Cookie的时效性

1.3.6 Cookie的path

1.4 Session技术

1.4.1 session概述

1.4.2 Session的入门案例

① 目标

② Session的API介绍

③ 在ServletDemo01中往Session域对象存储数据

④ 在ServletDemo02中从Session域对象中获取数据

1.4.3 Session的工作机制

1.4.4 Session的时效性

① 为什么Session要设置时限

② 设置时限的难点

③ 服务器端给Session对象设置最大闲置时间

④ 代码验证

⑤ 强制Session立即失效


学习目标

  • 了解为什么需要会话控制

  • 了解会话的范围

  • 掌握使用Cookie

  • 掌握使用Session

1.会话

1.1 为什么需要会话控制

保持用户登录状态,就是当用户在登录之后,会在服务器中保存该用户的登录状态,当该用户后续访问该项目中的其它动态资源(Servlet或者Thymeleaf)的时候,能够判断当前是否是已经登录过的。而从用户登录到用户退出登录这个过程中所发生的所有请求,其实都是在一次会话范围之内

1.2 域对象的范围
1.2.1 应用域的范围

整个项目部署之后,只会有一个应用域对象,所有客户端都是共同访问同一个应用域对象,在该项目的所有动态资源中也是共用一个应用域对象

1.2.2 请求域的范围

每一次请求都有一个请求域对象,当请求结束的时候对应的请求域对象也就销毁了

1.2.3 会话域的范围

会话域是从客户端连接上服务器开始,一直到客户端关闭,这一整个过程中发生的所有请求都在同一个会话域中;而不同的客户端是不能共用会话域的

1.3 Cookie技术
1.3.1 Cookie的概念

Cookie是一种客户端的会话技术,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。

1.3.2 Cookie的作用
  1. 在浏览器中存放数据

  2. 将浏览器中存放的数据携带到服务器

1.3.3 Cookie的应用场景

1.记住用户名 当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.

2.保存电影的播放进度

在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到cookie中

1.3.4 Cookie的入门案例
① 目标

实现在ServletDemo01和ServletDemo02之间共享数据,要求在会话域范围内共享

② Cookie相关的API
  • 创建一个Cookie对象(cookie只能保存字符串数据。且不能保存中文)

new Cookie(String name,String value);
  • 把cookie写回浏览器

response.addCookie(cookie); 
  • 获得浏览器带过来的所有Cookie:

request.getCookies() ; //得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
  • cookie的 API

cookie.getName() ; //返回cookie中设置的key
cookie.getValue(); //返回cookie中设置的value
③ ServletDemo01代码

在ServletDemo01中创建Cookie数据并响应给客户端

public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 创建一个cookie对象,用于存放键值对
        Cookie cookie = new Cookie("cookie-message","hello-cookie");
​
        //2. 将cookie添加到response中
        //底层是通过一个名为"Set-Cookie"的响应头携带到浏览器的
        response.addCookie(cookie);
    }
}

④ 浏览器发送请求携带Cookie

这里不需要我们操作,浏览器会在给服务器发送请求的时候,将cookie通过请求头自动携带到服务器

⑤ ServletDemo02获取Cookie数据的代码
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 从请求中取出cookie
        //底层是由名为"Cookie"的请求头携带的
        Cookie[] cookies = request.getCookies();
​
        //2. 遍历出每一个cookie
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                //匹配cookie的name
                if (cookie.getName().equals("cookie-message")) {
                    //它就是我们想要的那个cookie
                    //我们就获取它的value
                    String value = cookie.getValue();
                    System.out.println("在ServletDemo02中获取str的值为:" + value);
                }
            }
        }
    }
}
1.3.5 Cookie的时效性

如果我们不设置Cookie的时效性,默认情况下Cookie的有效期是一次会话范围内,我们可以通过cookie的setMaxAge()方法让Cookie持久化保存到浏览器上

  • 会话级Cookie

    • 服务器端并没有明确指定Cookie的存在时间

    • 在浏览器端,Cookie数据存在于内存中

    • 只要浏览器还开着,Cookie数据就一直都在

    • 浏览器关闭,内存中的Cookie数据就会被释放

  • 持久化Cookie

    • 服务器端明确设置了Cookie的存在时间

    • 在浏览器端,Cookie数据会被保存到硬盘上

    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响

    • 持久化Cookie到达了预设的时间会被释放

cookie.setMaxAge(int expiry)参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除

1.3.6 Cookie的path

上网时间长了,本地会保存很多Cookie。对浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的path属性值来和当前访问的地址进行比较,从而决定是否携带这个Cookie。

我们可以通过调用cookie的setPath()方法来设置cookie的path

1.4 Session技术
1.4.1 session概述

session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中

1.4.2 Session的入门案例
① 目标

实现在ServletDemo01和ServletDemo02之间共享数据,要求在会话域范围内共享

② Session的API介绍
  • request.getSession(); 获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)

  • Object getAttribute(String name) ;获取值

  • void setAttribute(String name, Object value) ;存储值

  • void removeAttribute(String name) ;移除值

③ 在ServletDemo01中往Session域对象存储数据
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取Session对象
        HttpSession session = request.getSession();
        //2. 往Session对象中存入数据
        session.setAttribute("session-message","hello-session");
    }
}
④ 在ServletDemo02中从Session域对象中获取数据
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取Session对象
        HttpSession session = request.getSession();
        //2. 往Session对象中存入数据
        String message = (String)session.getAttribute("session-message");
        System.out.println(message);
    }
}
1.4.3 Session的工作机制

前提:浏览器正常访问服务器

  • 服务器端没调用request.getSession()方法:什么都不会发生

  • 服务器端调用了request.getSession()方法

    • 服务器端检查当前请求中是否携带了JSESSIONID的Cookie

      • 有:根据JSESSIONID在服务器端查找对应的HttpSession对象

        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回

        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

代码验证

// 1.调用request对象的方法尝试获取HttpSession对象
HttpSession session = request.getSession();
​
// 2.调用HttpSession对象的isNew()方法
boolean wetherNew = session.isNew();
​
// 3.打印HttpSession对象是否为新对象
System.out.println("wetherNew = " + wetherNew+"HttpSession对象是新的":"HttpSession对象是旧的"));
​
// 4.调用HttpSession对象的getId()方法
String id = session.getId();
​
// 5.打印JSESSIONID的值
System.out.println("JSESSIONID = " + id);
1.4.4 Session的时效性
① 为什么Session要设置时限

用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

② 设置时限的难点

从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。

③ 服务器端给Session对象设置最大闲置时间
  • 默认值:1800秒

最大闲置时间生效的机制如下:

④ 代码验证
// ※测试时效性
// 获取默认的最大闲置时间
int maxInactiveIntervalSecond = session.getMaxInactiveInterval();
System.out.println("maxInactiveIntervalSecond = " + maxInactiveIntervalSecond);
​
// 设置默认的最大闲置时间
session.setMaxInactiveInterval(15);
⑤ 强制Session立即失效
session.invalidate();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1856989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自动化(8)——pyqt5界面

Python自动化(8)——pyqt5界面 注意:pyqt5的界面使用时必须有app QApplication(sys.argv)这行代码,否则会出现错误并且无法显示窗口:QWidget: Must construct a QApplication before a QWidget 一些基础的控件 QMainWindow QMainWindow是…

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index.…

(1995-2022年) 全国各省份-技术交易活跃度

技术交易活跃度是一个关键指标,用于衡量技术市场的交易频繁程度和活跃性。它不仅显示了市场参与者对技术交易的参与热情,而且交易的频率也体现了市场的活力。这一指标对于不同的利益相关者具有不同的意义: 对投资者而言,技术交易…

尚硅谷k8s

p1-6 阿里云服务器开通流程 阿里云服务器购买等各种操作,省略 p7 私有网络vpc实战 VPC(Virtual Private Cloud)网络,是一种基于云计算的网络服务,旨在为用户提供在公有云上自定义的、逻辑隔离的网络空间。 设置vpc可以使网络之…

让生产管理变简单

随着业务的发展,工厂每天要处理很多订单,还要统筹安排各部门工作以及协调上下游加工企业,生产管理问题也随之而来。 1.销售订单评审困难、无法及时抓取到历史数据做参考。由于数据的不及时性、不准确性无法为正常的生产和采购提供数据支撑。同…

Linux关闭swap分区操作[适用于CDH报警等]

1.查看swap分区挂载路径(没卵用) swapon -s 2.设置配置文件的swap配置 echo “vm.swappiness 0” > /etc/sysctl.conf 3.设置内存中的swap状态。有时候配置文件为0,但集群或服务仍然使用了swap分区,可能原因就是内存没有同步配置 echo “0” > …

X-AnyLabeling使用教程

1.AI 模型自动分割标注使用教程 2.AI 模型自动目标检测标注使用教程

HTML(23)——垂直对齐方式

垂直对齐方式 属性名:vertical-align 属性值效果baseline基线对齐(默认)top顶部对齐middle居中对齐bottom底部对齐 默认情况下浏览器对行内块,行内标签都按文字处理,默认基线对齐 导致图片看起来会偏上,文字偏下。 示例&#…

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 &am…

安规管理:PLM安规管理、PLM安规管理新策略

安规管理:PLM安规管理、PLM安规管理新策略 随着科技的飞速发展,电子产品已经成为我们生活中不可或缺的一部分。然而,这些产品在给人们带来便利的同时,也可能带来触电、火灾、有害辐射等安全隐患。为了保护消费者的生命财产安全&am…

NSSCTF-Web题目15

目录 [HNCTF 2022 WEEK2]ez_SSTI 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]Ez_upload 1、题目 2、知识点 3、思路 [HNCTF 2022 WEEK2]ez_SSTI 1、题目 2、知识点 SSTI、Jinja2 参考链接:1. SSTI(模板注入)漏洞(…

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计(雨量桶):最早使用的降雨量传感器,通过漏斗收集雨水并记录。主要用于长期降雨统计,故障率较低。电容式降雨量传感器:基于两个电极之间的电容变化来计算降雨量。当降雨时&#xff…

2024年经济与国际贸易国际会议(ICEIT 2024)

2024年经济与国际贸易国际会议(ICEIT 2024) 2024 International Conference on Economy and International Trade 【重要信息】 大会地点:温州 大会官网:http://www.iciceit.com 投稿邮箱:iciceitsub-conf.com 【注意…

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引…

一个易于使用、与Android系统良好整合的多合一游戏模拟器

大家好,今天给大家分享的是一个易于使用、与Android系统良好整合的多合一游戏模拟器 Lemuroid。 Lemuroid 是一个专为Android平台设计的开源游戏模拟器项目,它基于强大的Libretro框架,旨在提供广泛的兼容性和卓越的用户体验。 项目介绍 Lem…

SQLServer 索引与数据完整性---学习笔记

索引 索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针 索引是一个单独的、物理的数据库结构,在SQL Server中,索引是为了加速对表中数据行的检索而创建的一种分散存储结构。 它是针对一个表而建立的&#xff0…

【UIDynamic-动力学-UIAttachmentBehavior-附着行为-弹性附着 Objective-C语言】

一、弹性附着啊,我们来看一下, 1.刚才我们说了刚性附着,弹性附着,怎么着做啊,实际上,只需要多添加两个属性,就可以了, 实际上,添加一个,也可以啊, 我们把这个length,先注释掉, 先注释掉,self.attach.length = 100;这句话, 固定的长度啊,给它注释掉, 然后呢…

多源 BFS

例题一 解法(bfs)(多个源头的最短路问题) 算法思路: 对于求的最终结果,我们有两种⽅式: • 第⼀种⽅式:从每⼀个 1 开始,然后通过层序遍历找到离它最近的 0 。 …

Spring底层原理之bean的加载方式一 用XML方式声明bean 自定义bean及加载第三方bean 2024详解

目录 用XML方式声明bean 首先我们创建一个空的java工程 我们要导入一个spring的依赖 注意在maven工程里瞅一眼 我们创建一个业务层接口 还有四个实现类 我们最初的spingboot生命bean的方式是通过xml声明 我们在resources文件夹下创建一个配置文件 我们书写代码 首先初…

糖尿病早中期症状常常被人们忽视,从而错过最佳的干预时机。

我们都知道糖尿病有“三多一少”(多饮、多尿、多食、体重减少)的典型症状。然而,现实中糖尿病的表现并非总是如此清晰。更麻烦的是,糖尿病具有很强的隐匿性,若不做血糖检查,多数人难以察觉自己已患病。 今天…