会话跟踪技术(Session 以及Cookie)

一: 前提概要

        1>会话:

        会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应

        2>会话跟踪:

        是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求, 分别来自于那些会话, 以便在一次的会话当中的多次请求已经响应当中, 实现 "数据共享"

        3>服务器为什么不能够识别这些请求来自哪个浏览器?

        因为服务器跟浏览器之间使用的是HTTP协议, HTTP协议是无状态的, 每次浏览器向服务器进行请求的时候, 服务器都会将其视作新的请求, 所以我们需要会话跟踪技术实现会话之间的数据共享

        4>实现方式:

        1.客户端会话跟踪技术:  Cookie

        客户端会话跟踪技术, 实际上就是将一些共享的数据存储在客户端

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

        服务端会话跟踪技术, 实际上就是将共享的数据存储在服务端

                两者实现的功能其实都是一样的,都是为了解决一次会话中, 多次请求的问题

二: 实现方式--Cookie

        1>基本使用:

                1.发送Cookie:

 // 发送cookie
//创建cookie  进行发送cookie
        //1.创建cookie对象
        Cookie cookie = new Cookie("username", "zs");

        resp.addCookie(cookie);

                2.获取Cookie:


//        获取响应的cookie
        //在这里, 我们通过req获得的cookie包括了其中所有的cookie, 所以需要通过数组进行相应的接收
        Cookie[] cookies = req.getCookies();
//        之后通过循环 以及一些判断的方式来获响应的数据, 键值对
        for (Cookie cookie : cookies) {
            String name = cookie.getName();

//            进行判断, 我们仅仅只需要我们所输入的键值对即可
            if ("username".equals(name)){
                String value = cookie.getValue();
                System.out.println(name+" "+value);
                break;
            }

        2>Cookic原理:

        需要知道的一点是: COOKIE的实现都是基于HTTP协议的!

举例:

        在浏览器发送请求之后, 服务端识别出来是cookie, 这个时候服务端会将相应的共享数据存储在响应头(set-cookie)当中, 之后, 将其相应到浏览器当中, 并且将相应的数据存储在浏览器内存中

        之后, 浏览器在同一个会话当中再次发送请求, 并且将刚才存储的共享数据放在请求头 (cookie)当中, 以请求的方式放入服务端, 从而实现数据的共享

        3>Cookie的使用细节:

        1.存活时间:

                默认的情况下, Cookie会存储在浏览器当中 , 浏览器关闭的时候相应的Cookie会自动的进行销毁

        2.手动设置Cookie的存活时间:

        

        通过这种方式, 可以实现某些记住账号, 密码的任务

Cookie cookie = new Cookie("username", "zs");

//        设置存活时间:  一周
        cookie.setMaxAge(60*60*24*7);


        resp.addCookie(cookie);

        3.Cookie存储中文:

        实际上Cookie不能够直接存储相应的中文信息, 比如在这里, 我将相应的值设置为  '张三'

  Cookie cookie = new Cookie("username", "zs");

        进行访问就会出现以下的错误:

        *解决方式:URL编码*

        通过使用URL编码 URL解码  的方式进行转码:

String value="张三";
        //URL编码:
        value = URLEncoder.encode(value,"UTF-8");
        System.out.println(value);
        Cookie cookie = new Cookie("username", value);
        System.out.println("username"+" "+value);
if ("username".equals(name)){
                String value = cookie.getValue();
                //url解码
                value = URLDecoder.decode(value, "UTF-8");
//                进行打印
                System.out.println(name+" "+value);
                break;
            }

        问题得到解决 

三: 实现方法 -- Session:

        1>基本使用:

        1.发送Session:

  // 存储到Session当中
//        1.获取Session对象
        HttpSession session = req.getSession();
        //2.存储数据
        session.setAttribute("username","zs");

        2.获取Session:

  //获取数据
        //1获取Session对象:
        HttpSession session = req.getSession();

        Object username = session.getAttribute("username");
        System.out.println(username);

        2>Session原理:

        结论 :  Session是基于Cookie来进行实现的

示例:

        服务器在接收到相应的请求之后, 发现使用的是Session的方式, 之后就会解析Session的ID, 将其进行记录, 之后再将其通过Cookie的方式, 使用请求头(set-cookie)并且在其中保存ID的值, 传给客户端, 之后客户端将相应的值保存在浏览器当中, 之后再进行响应, 将刚才的数据以响应头(cookie)并且附带之前的地址值传给服务端

        3>Session的使用细节:

        1.Session的钝化, 活化:

        在服务器进行重启之后, Session之前进行提交的数据是否还会存在?(这里指的是正常的关闭, 在IDEA的控制面板当中, 如果直接停止程序是非正常关闭系统)

        ①钝化:

        指的是在服务器进行正常的关闭之后, Tomcat会自动的将Tomcat当中的数据存在硬盘当中

        ②活化:

        再次进行启动服务器之后, 从文件当中加载数据到Session当中, 即在正常关闭之后, 之前的Session是不会被立刻的销毁的, 再次进行启用的时候就会继续加上上一次的数据到Session当中

        TIPS:需要注意的一点是, 如果不关闭服务器, 而是在启动服务器之后在浏览器进行访问, 关闭网页, 再次进行访问, 这个时候对应的Session并不是同一个的Session地址值会发生改变, 不再是同一个地址值

        2.Session的销毁:

        

        第二种自我销毁的方式, 常常会被用于在退出登录的时候, 销毁相应的Session对象

        

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下,3月25日下午,和鲸科技 2024 年“人工智能X”学科建设合作交流会(北京站)暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境,本次会议特别采取闭门审…

Flink on Kubernetes (flink-operator) 部署Flink

flink on k8s 官网 https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.1/docs/try-flink-kubernetes-operator/quick-start/ 我的部署脚本和官网不一样,有些地方官网不够详细 部署k8s集群 注意,按照默认配置至少有两台wo…

概率论经典题目-二维随机变量及分布--求离散型的联合分布律和边缘分布律问题

题目:一整数N等可能地在1,2,3,…,10十个值中取一个值设DD(N)是能整除N的正整数的个数,FF(N)是能整除N的素数的个数(注意1不是素数).试写出D和F的联合分布律,并求边缘分布律? 解答: 1)要确定整数 N 能够被整除的正整数个数 D 和素…

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂,能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题,与人类不同LLM经常在推理中涉及的隐含步骤中挣扎,这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…

可重复不限数量结构数列的演化

有一个6*6的平面,这个平面的行和列可以自由的变换,在这个平面上有一个4点结构数列 按照8,13,5,8的顺序排列。让这个数列按照4-5-4的方式演化 这个数列很快收敛,收敛顺序为13,8,8,5 8…

Revit文件版本查看小工具

最近群里和私信的时候,经常有小伙伴询问如何不打开Revit查看Revit文件的版本。 习惯性的,第一思路是打开Dynamo,但是第一反应还需要先开Revit。 另外呢,群里小伙伴说优比的插件也可以。 总之呢,都需要一些工具&#xf…

对接中泰极速行情 | DolphinDB XTP 插件使用教程

XTP 是中泰证券推出的高性能交易平台,专为专业投资者提供高速行情及交易系统,旨在提供优质便捷的市场接入通道。目前支持股票、基金、ETF、债券、期权等多个市场,可满足不同投资者需求。 基于 XTP 官方 C SDK,DolphinDB 开发了 X…

【IDEA】使用debug方式去运行java程序

什么是debug工具? 调试工具(debug工具)是一种用于帮助程序员识别和修复程序中的错误的工具。它们提供了一系列的功能,帮助程序员在代码执行的过程中跟踪和检测问题,例如查看变量的值、检查函数的调用栈、设置断点来停…

算法学习——LeetCode力扣动态规划篇2

算法学习——LeetCode力扣动态规划篇2 343. 整数拆分 343. 整数拆分 - 力扣(LeetCode) 描述 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得…

java: 找不到符号 符号: 变量 log

在以下位置加上该配置"-Djps.track.ap.dependenciesfalse"

文件操作(随机读写篇)

1. 铺垫 建议先看: 文件操作(基础知识篇)-CSDN博客 文件操作(顺序读写篇)-CSDN博客 首先要指出的是,本篇文章中的“文件指针”并不是指FILE*类型的指针,而是类似于打字时的光标的东西。 打…

C++:类的6大默认成员函数:赋值运算符重载

文章目录 赋值运算符重载1.1 运算符重载的引用1.2 运算符重载的概念1.3 赋值运算符重载总结一下(赋值运算符) 赋值运算符重载 1.1 运算符重载的引用 有一个日期类Date: class Date { public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_da…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制,可以为大家提供条件编译和可选依赖的高级特性,可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档:Conditional compilation - The Rust Reference features特性 Featuure 可以…

GeometryInstance点击改变颜色

目录 项目地址实现效果核心代码 项目地址 https://github.com/zhengjie9510/webgis-demo 实现效果 核心代码 // Draw different instances each with a unique color const rectangleInstance new Cesium.GeometryInstance({geometry: new Cesium.RectangleGeometry({recta…

EFCore的空迁移(EFCore操作已存在的数据库表,不影响其中的数据)

背景:EFCore默认的会自动创建数据表,但是有时又是DBFirst,数据库写好了要用现成的表。这个时候就需要进行一些特殊的操作了 1、写出跟要对接数据库的实体类 比如我的表是这样创建的 create table mail_test (user_id bigint auto_increment …

【Entity Framework】EF中DbSet类详解

【Entity Framework】EF中DbSet类详解 文章目录 【Entity Framework】EF中DbSet类详解一、概述二、定义DbSet2.1 具有DbSet属性的DbContext2.2 具有 IDbSet 属性的 DbContext 2.3 具有 IDbSet 属性的 DbContext三、DbSet属性四、DbSet方法五、DbContext动态生成DbSet 一、概述 …

医院消防巡检系统革新:凡尔码平台二维码技术引领安全升级

医院消防巡检,传统依赖手工记录,效率和准确性受限。凡尔码平台的二维码消防巡检系统,以创新技术颠覆传统,实现即时、精准的安全管理,确保医院消防安全无虞。 凡尔码平台的消防巡检系统不仅提升了医院安全管理的效率&a…

基于SpringBoot + Vue实现的校园失物招领系统设计与实现+毕业论文

介绍 系统包含用户和管理员两个角色 用户:登录、注册、留言板、公告信息、失物招领、失物认领、寻物启事、个人中心、我发布的失物信息、我的失物认领、我发布的寻物启事、寻物启事留言等功能。 管理员:登录、基础数据管理、系统管理、留言板管理、失物信…

Linux项目自动化构建工具-make/ makefile及其应用:多文件编写第一个linux程序:进度条(懒人学习必备博文!!!)

目录 1.前言--make/makefile的引入 2.快速上手make/makefile---自动化构建 3.关于依赖关系和依赖方法 4.自动化清理 为什么我们执行编译的时候,make一下就好,清理却要使用make clean? 5. make/makefile是如何知道当前目录下可执行文件是否为最新 6.文件…

SQLServer sys.default_constraints介绍

sys.default_constraints 是 SQL Server 的系统视图,它包含了数据库中所有默认约束的信息。默认约束是数据库对象(如表中的列)的约束,它为列定义了一个默认值,当在插入新行时没有为该列提供值时,将使用这个…