session和cookie机制

news2025/1/11 7:42:40

2023.10.23

域对象

        先总结一下到目前位置我所了解的域对象:

  • request(对应的类名:HttpServletRequest)

    • 请求域(请求级别的)

  • session(对应的类名:HttpSession)

    • 会话域(用户级别的)

  • application(对应的类名:ServletContext)

    • 应用域(项目级别的,所有用户共享的。)

  • 这三个域对象的大小关系

    • request < session < application

  • 他们三个域对象都有以下三个公共的方法:

    • setAttribute(向域当中绑定数据)

    • getAttribute(从域当中获取数据)

    • removeAttribute(删除域当中的数据)

  • 使用原则:尽量使用小的域。

Session

什么是session?

         session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。 

  • session对象是存储在服务器端的
  • 一个session对象对应一个对话
  • 一个对话包含多次请求

session如何获取?

HttpSession session = request.getSession();

        该行代码能从服务器中获取当前的session对象,若没有获取到任何session对象,则新建一个。

HttpSession session = request.getSession(false);

        该行代码能从服务器中获取当前的session对象,若没有获取到任何session对象,则返回null。

为什么需要session对象来保存会话状态?

        因为HTTP协议是一种无状态协议。(无状态:请求的时候,浏览器和服务器是连接的,但是请求结束之后,连接就断了。之所以这样设计是为了减少服务器的压力 )  

session对象的实现原理

        在web服务器中有一个session列表。类似于map集合。这个map集合的key存储的是sessionid,这个map集合的value存储的是对应的session对象。

        用户发送第一次请求的时候:服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器会将session的id发送给浏览器,浏览器将session的id保存在浏览器的缓存中。

        用户发送第二次请求的时候:会自动将浏览器缓存中的sessionid自动发送给服务器,服务器获取到sessionid,然后从session列表中查找到对应的session对象。

为什么关闭浏览器会话就结束了?

        关闭浏览器之后,浏览器中保存的sessionid消失,下次重新打开浏览器之后,浏览器缓存中没有这个sessionid,自然找不到服务器中对应的session对象,所以此时相当于会话结束了。

        但是服务器并不知道你关闭了浏览器,所以此时session对象可能仍然存在于服务器中,此时session对象的销毁需要依靠session的超时机制。 还有一种可能,系统提供了“安全退出”选项,点了这个按钮,服务器就知道你退出了,然后服务器就会销毁session对象。

Cookie禁用了,session还能找到吗?

        cookie禁用是什么意思?服务器正常发送cookie给浏览器,但是浏览器不要了。拒收了。并不是服务器不发了。此时session就找不到了,每一次请求都会获取到新的session对象。

        cookie禁用了,session机制还是可以实现的。需要使用URL重写机制,如:

         在url后面手动添加sessionid。

Cookie

        cookie和session机制其实都是为了保存会话的状态。

        session的实现原理中,每一个session对象都会关联一个sessionid。例如:JSESSIONID=41C481F0224664BDB28E95081D23D5B8。

        以上的这个键值对数据就是cookie对象。对于session关联的cookie来说,这个cookie是被保存在浏览器的“运行内存”当中。只要浏览器不关闭,用户再次发送请求的时候,会自动将运行内存中的cookie发送给服务器。服务器就是根据Cookie中的JSESSIONID来找到对应的session对象的。

cookie保存在什么地方?

        cookie最终是保存在浏览器客户端上的。 既可以保存在运行内存中。(浏览器只要关闭cookie就消失了) 也可以保存在硬盘文件中。(永久保存)

cookie的经典案例

        1、京东商城在未登录的情况下,向购物车中放几件商品。然后关闭商城,再次打开浏览器,访问京东商城的时候,购物车中的商品还在,这是怎么做到的?我没有登录,为什么购物车中还有商品?      

  • 将购物车中的商品编号放到cookie当中,cookie保存在硬盘文件当中。这样即使关闭浏览器。硬盘上的cookie还在。下一次再打开京东商城的时候,查看购物车的时候,会自动读取本地硬盘中存储的cookie,拿到商品编号,动态展示购物车中的商品。

    • 京东存储购物车中商品的cookie可能是这样的:productIds=xxxxx,yyyy,zzz,kkkk

    • 注意:cookie如果清除掉,购物车中的商品就消失了。

        2、126邮箱中有一个功能:十天内免登录。 该功能是如何实现的?

  • 用户输入正确的用户名和密码,并且同时选择十天内免登录。登录成功后。浏览器客户端会保存一个cookie,这个cookie中保存了用户名和密码等信息,这个cookie是保存在硬盘文件当中的,十天有效。在十天内用户再次访问126的时候,浏览器自动提交126的关联的cookie给服务器,服务器接收到cookie之后,获取用户名和密码,验证,通过之后,自动登录成功。

  • 怎么让cookie失效?

    • 十天过后自动失效。

    • 或者改密码。

    • 或者在客户端浏览器上清除cookie。


        cookie机制和session机制其实都不属于java中的机制,实际上cookie机制和session机制都是HTTP协议的一部分。php开发中也有cookie和session机制,只要是你是做web开发,不管是什么编程语言,cookie和session机制都是需要的。

        HTTP协议中规定:任何一个cookie都是由name和value组成的。name和value都是字符串类型的。

java的servlet对cookie提供了哪些支持?   

  • 提供了一个Cookie类来专门表示cookie数据。jakarta.servlet.http.Cookie;

  • java程序怎么把cookie数据发送给浏览器呢?response.addCookie(cookie);

        在HTTP协议中是这样规定的:当浏览器发送请求的时候,会自动携带该path下的cookie数据给服务器。即访问不同路径对应的cookie数据不一样,比如访问京东会携带京东的cookie,访问淘宝会携带淘宝的cookie。

关于cookie的有效时间设置

  • 怎么用java设置cookie的有效时间

    • cookie.setMaxAge(60 * 60); 设置cookie在一小时之后失效。

  • 没有设置有效时间:默认保存在浏览器的运行内存中,浏览器关闭则cookie消失。

  • 只要设置cookie的有效时间 > 0,这个cookie一定会存储到硬盘文件当中。

  • 设置cookie的有效时间 = 0 呢?

    • cookie被删除,同名cookie被删除。

  • 设置cookie的有效时间 < 0 呢?

    • 保存在运行内存中。和不设置有效时间一个效果。

浏览器发送cookie给服务器了,服务器中的java程序怎么接收?

Cookie[] cookies = request.getCookies(); // 这个方法可能返回null
if(cookies != null){
    for(Cookie cookie : cookies){
        // 获取cookie的name
        String name = cookie.getName();
        // 获取cookie的value
        String value = cookie.getValue();
    }
}

 

        

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

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

相关文章

ITSource 分享 第1期【在线考试系统】

项目介绍 本期给大家介绍一个问卷调查系统. 一起来看看吧 ! 一 业务介绍 该系统分为以下几个模块: 1.我的问卷 image.png 可以查看创建的所有问卷, 包括 收集中,编辑中,已关闭等状态 2.创建问卷 image.png 问题类型可以选择有多种选择: 3.发布并填写问卷 问卷编辑完成后,即可保…

国内外CDN的发展

当今互联网世界中&#xff0c;内容交付网络&#xff08;Content Delivery Network&#xff0c;CDN&#xff09;已经成为网络加速的不可或缺的工具。CDN技术在国内外得到广泛应用&#xff0c;为了更好地了解CDN的不同之处以及未来的发展趋势&#xff0c;让我们深入探讨这一领域的…

Spring底层原理(三)

Spring底层原理(三) Bean的生命周期 SpringBootApplication public class Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(Application.class, args);context.close();} } ​ Slf4j Component public…

MySQL身份验证绕过漏洞

搭建 vmihub靶场:vulhub靶场搭建与使用_剁椒鱼头没剁椒的博客-CSDN博客 运行漏洞: # 这里要改成自己的 /vulhub-master 存放目录 cd /etc/docker/vulhub-master/mysql/CVE-2012-2122# 关闭防火墙,不然就要放行3306端口 systemctl stop firewalld# 重启 Docker 服务 servic…

C# | Linq基本功 —— 必学的必熟的10个方法

C# Linq基本功 —— 必学的必熟的10个方法 文章目录 C# Linq基本功 —— 必学的必熟的10个方法1. Linq简介1.1 什么是Linq1.2 Linq的优势 2. Linq基本方法2.1 Where方法2.2 Select方法2.3 OrderBy方法2.4 GroupBy方法2.5 Join方法2.6 Any方法2.7 All方法2.8 First方法2.9 Skip方…

1024勋章

&#x1f338;关于重阳节的一些发疯日常&#xff08;昨天的聊天记录&#xff0c;今天发系列&#xff09;&#x1f605; &#x1f338;没错&#xff0c;发出来单纯觉得好玩儿&#x1f609;(为了1024勋章&#x1f60f;)芜湖&#xff01;

Kepware带你玩转IEC60870-104驱动

随着越来越多电力设备自动化程度的不断提高以及OPC协议的广泛应用&#xff0c;越多客户倾向于使用更为方便、快捷的方式去获取数据&#xff0c;IEC60870-5-104协议作为一个标准的电子自动化协议&#xff0c;在电力自动化现场应用非常广泛。 本文介绍KEPServerEX的IEC-104驱动&…

WeakMap 弱引用 不会被GC所考量

WeakMap是一种特殊的Map数据结构&#xff0c;只能以引用作为key&#xff0c;并且不会阻止其被垃圾回收。WeakMap的使用如下&#xff1a; 1. 创建WeakMap对象&#xff1a; const weakMap new WeakMap();2. 添加键值对&#xff1a;使用set()方法向WeakMap中添加键值对。注意这里…

c++ 模版的一些注意问题

声明和定义不可分离 举个例子&#xff1a; 定义一个Stack.h: 这里放声明 #include<iostream>using namespace std;template<class T> T Add(const T& left, const T& right);定义一个Stack.cpp, 这里面放定义: template<class T> T Add(const T&a…

虚拟机VMware Workstation Pro安装配置使用服务器系统ubuntu-22.04.3-live-server-amd64.iso

虚拟机里安装ubuntu-23.04-beta-desktop-amd64开启SSH(换源和备份)配置中文以及中文输入法等 ​一、获取Ubuntu服务器版 获取Ubuntu服务器版 二、配置虚拟机 选择Custom(advanced)&#xff1a; 选择Workstation 17.x: 选择“I will install the operating system later.”…

HashMap源码解析_jdk1.8(二)

HashMap源码解析_jdk1.8&#xff08;二&#xff09;构造函数put方法resize扩容方法 HashMap源码解析_jdk1.8&#xff08;二&#xff09; 构造函数 HashMap提供了如下几个构造函数&#xff1a; /*** 构造一个具有指定初始容量和负载因子的空HashMap.** param initialCapacit…

Android SystemUI setSystemUiVisibility()参数Flag详解

1&#xff1a;相关 Flag 特性详解 View.SYSTEM_UI_FLAG_LAYOUT_STABLE&#xff1a; 特性&#xff1a;默认状态下 &#xff0c;稳定页面显示布局。 当 StatusBar和 NavigationBar动态显示和隐藏时&#xff0c;系统为 fitSystemWindow“true”的view设置的padding大小都不会变化…

《机器学习实战》学习记录-ch4

4.1 线性回归 import numpy as np import matplotlib.pyplot as plt import pandas as pdX 2 * np.random.rand(100,1) # 生成 [0,1) 之间的数据 y 4 3 * X np.random.randn(100,1) # 生成一组正态分布的数据&#xff0c; 高斯噪声X_b np.c_[np.ones((100,1)), X] X_b[:5…

h265格式怎么转换mp4?一分钟教会你!

H265是一种视频编码标准&#xff0c;也被称为HEVC&#xff08;High Efficiency Video Coding&#xff09;。由联合视频组&#xff08;JVET&#xff09;开发的&#xff0c;是一种专为高清视频设计的压缩标准。播放H265文件&#xff0c;通常需要使用支持H265解码的播放器&#xf…

Docker 网络与Cgroup资源限制

目录 一、Docker 网络实现原理&#xff1a; 二、Docker 的网络模式&#xff1a; 三、网络模式详解&#xff1a; 1. host模式&#xff1a; 2. container模式&#xff1a; 3. none模式: 4&#xff0e;bridge模式: 5&#xff0e;自定义网络: 四、Cgroup资源控制&#xff1a; …

仿真调试stm32汇编代码

软件准备 ubuntu交叉编译链工具&#xff1a;arm-none-eabi-gcc, arm-none-eabi-as, arm-none-eabi-ldqemu仿真软件&#xff1a;支持stm32版本调试工具&#xff1a;gdb-multiarch 启动仿真实验 汇编代码 .thumb .syntax unified.equ STACKINIT, 0x20005000.section .text .o…

玩具玩偶经营小程序商城的作用是什么

对品牌商而言&#xff0c;传统的批发商模式&#xff0c;不利于品牌传播及构建自有私域流量池&#xff0c;无法与消费者面对面交流&#xff0c;一旦销售量不好&#xff0c;只能受限于下游的以销定产。无论销售商还是品牌商即使入驻第三方平台&#xff0c;也会面临佣金、广告位问…

开发习惯养成系列

1 开发习惯养成系列 2

【趣味Javascript】前端开发中不为人知的LHS和RHS查询,你真的弄明白了吗? 《1024程序员节特别篇》

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

你知道AI数字人可以用在哪些行业吗?

引言&#xff1a; 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到各个领域&#xff0c;其中包括宣传营销。AI数字人是宣传营销领域的一项革命性技术&#xff0c;它们为企业提供了全新的机会&#xff0c;从客户互动到市场分析&#xff0c;再到销…