Servlet(三)-------Cookie和session

在这里插入图片描述

一.Cookie和Session

Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件,由服务器发送给浏览器。当用户再次访问同一网站时,浏览器会把Cookie信息发送回服务器。例如,网站可以利用Cookie记住用户的登录状态、语言偏好等信息。Cookie有一定的有效期,可以设置过期时间。Session是存储在服务器端的数据结构,用于跟踪用户的会话状态。服务器为每个用户(通常是通过用户的首次请求)创建一个Session,会给用户分配一个唯一的标识符(Session ID),这个ID一般通过Cookie或URL参数等方式传递给浏览器。当用户在网站的不同页面之间跳转时,浏览器会发送Session ID,服务器根据这个ID来识别用户并获取对应的会话数据,如购物车中的商品信息等。

二.Cookie和Session的联系与区别

1.cookie是什么

在浏览器访问服务器之前,此时你的浏览器对于这个服务器是一无所知的,你的浏览器上是没有任何和这个服务器相关的数据的。在网页开发中用户获取数据和服务器发送数据会产生很多“临时性”的数据。临时性的数据有的可以放在服务器这边存储,有的可以放在浏览器上,用户下次用可以直接获取到。
比如哔哩哔哩中倍速播放,蓝光模式这种数据就是临时数据,用户下次再点开还是倍速蓝光。
在这里插入图片描述

浏览器要保存数据为什么要放在cookie上,直接放硬盘上不行吗?
答案:不行,如果让网页能轻易的访问你的系统文件是非常危险的有可能会中病毒让电脑奔溃或者数据删掉。为了保证安全浏览器会对网页的功能做出限制,禁止访问硬盘。为了能保证安全又能存储数据,浏览器就提供了cookie功能。

cookie是按照键值对的方式存储一些字符串。这些键值对往往是服务器返回来的。浏览器把这些键值对按照域名进行分类存储,不同的网站cookie是独立的。这些cookie的内容是程序员自己定义的。

在这里插入图片描述

一个网站中cookie中会存储很多键值对,往往会有一个很重要的键值对,用来统计用户的信息。为了实现身份识别的效果,不仅仅需要cookie来支持,在服务器这边也需要session来支持。

2.举例

假设你是第一次来医院看病,首次挂号的时候,医院会让你办一张就诊卡。同时在医院的系统里面会给你创建一份电子的档案。当你排了半天队,见到医生,医生让你刷你的就诊卡,你一刷卡你的各种信息就显示在医生的电脑上了。(就诊卡里面存了你的身份标识,存了一串字符串,就像电话号码一样),电子档案可以想象成哈希表,key是你的身份标识,value是你的电子档案详情。刷卡的时候读卡器读到我的身份标识就可以知道我的电子档案的详情了。然后医生让你去抽血,做B超,尿检。到了抽血科,医生也是让先刷卡,刷卡后知道你的病就知道要抽多少血哪里的血。来到B超科后同样先刷卡拿到你的信息,就知道怎么检查。检查完毕后医生还得刷卡拿信息取药。当你下一次来的时候医生可以直接系统里面拿到你的信息和之前的取药结果。

首次访问网站登录成功后相当于网站给你一个就诊卡(身份标识,身份标识也叫sessionid),身份标识就通过服务器返回给浏览器的响应,保存在浏览器的cookie中了。与此同时人家网站服务器这边也会创建出一个对应的session(电子档案),session中会记录你的信息。网站服务器有很多个用户,每个用户都有自己的session,他们的sessionid各不相同,服务器会使用类似于HASH表这样的方式,以sessionid为key,以session为value,把所有数据组织起来。后续访问网站的其他页面(相当于到各个科室做检查),都会在请求的cookie字段中,带上刚才这里的sessionid(也就是做检查先刷卡,判断你的信息),服务器就知道你当前的用户信息了。

我们通过抓包可以看到cookie里面的主要内容:
在这里插入图片描述
是以键值对的方式去存储的。键值对之间使用;分割,键和值使用=分割。在cookie中其中一个键值对是表示身份标识的。

3.Session

session存在的意义也是为了让用户能够保存一些自定义数据,此时的session更像是一个Map<String,Object>。session在一个服务器上可以存在很多份,每个用户都应该有一个自己的session,应该服务器有多个用户,服务器就会用map的方式组织session.
在这里插入图片描述

4.总结

Cookie 是浏览器在本地持久化存储数据的一种机制。
1.Cookie的数据从哪里来?服务器返回给浏览器的。
2.Cookie的数据长啥样?Cookie 中是键值对结构的数据.并且这里的键值对都是程序员自定义的。
3.Cookie有什么作用?Cookie 就可以在浏览器这边存储一些“临时性的数据”,其中最典型的一种使用方式,就是用来存储“身份标识”。
4.Cookie到哪里去?Cookie的内容会在下次访问该网站的时候,自动的被带到HTTP请求中。
5.Cookie怎么存的?浏览器按照不同的“域名”分别存储Cookie,域名和域名之间的Cookie是不能干扰的Cookie 存储在硬盘上的。Cookie存储往往会有一个超时时间。

Cookie的超时时间也叫过期时间,是指浏览器存储Cookie的有效时长。当服务器发送一个Cookie给浏览器时,会设置这个Cookie的相关属性,其中就包括过期时间。如果没有设置超时时间,Cookie就会成为会话Cookie,它会在浏览器会话期间(即浏览器打开到关闭的时间段)一直存在,一旦浏览器关闭,会话Cookie就会被删除。 要是设置了具体的超时时间,浏览器会根据这个时间来存储Cookie。例如,设置超时时间为1小时,那么从Cookie被设置开始计算,1个小时后,浏览器会自动删除这个Cookie,之后对相应网站的请求就不会再带上这个已经过期的Cookie。这样的机制可以控制用户数据在客户端存储的周期,用于实现如用户登录状态保持一定时间等功能。
在这里插入图片描述

在这里插入图片描述

二.核心方法

HttpServletRequest 类中的相关方法
在这里插入图片描述

HttpServletResponse类中的相关方法
在这里插入图片描述
HttpSession 类中的相关方法
一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息。
在这里插入图片描述
Cookie 类中的相关方法
在这里插入图片描述

HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie
对象。
通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对。
通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对。

1.获取cookie

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.util.Enumeration;
class User{
    public String username;
    public int age;
}
@WebServlet("/hello1")
public class HelloSevert extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("date","2024-10-24");
        resp.addCookie(cookie);
        Cookie cookie1 = new Cookie("date1","2024-10-25");
        resp.addCookie(cookie1);
        resp.getWriter().write("ok");

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for(Cookie x:cookies)
        {
            System.out.println(x.getName()+":"+x.getValue());
        }
    }
}

在这里插入图片描述
通过抓包继续观察
在这里插入图片描述

2.获取session

代码示例: 实现用户登陆
实现简单的用户登陆逻辑
这个代码中主要是通过 HttpSession 类完成. 并不需要我们手动操作 Cookie 对象。

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Enumeration;
class User{
    public String username;
    public int age;
}
@WebServlet("/hello1")
public class HelloSevert extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      String user = req.getParameter("username");
      String password = req.getParameter("password");
      if(user==null||password==null||user.equals("")||password.equals("")){
          
          resp.setContentType("text/html,charset=utf8");
          resp.getWriter().write("用户名错误");
          return;
      }
      if(user.equals("aaa")&&password.equals("123")){
         
          HttpSession session = req.getSession(true);
          session.setAttribute("username",user);
          session.setAttribute("time",System.currentTimeMillis());
         
      }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        if(session==null)
        {
          
            return;
        }
        String user = (String)session.getAttribute("username");

   
        System.out.println("user:"+user);
   
    }
}

在这里插入图片描述
在这里插入图片描述

HttpSession session = req.getSession(true);参数为true不存在会话就创建,存在会话就直接查询。参数为false不存在就返回null,存在就直接查询。
getSession 背后做的事情:
1.先读取请求中的Cookie,看Cookie 里是否有JSESSIONID属性,以及值是啥。如果没有,就认为需要创建新会话。如果有,就拿着这个id去查询看看当前的session 是否存在,要是 session存在,就直接返回该 session,要是session不存在,就准备创建新会话。
2.当前确实需要创建会话,就会创建出一个Session 对象,同时生成一个唯一的JSESSIONID。
以JSESSIONID为key,Session对象为value,把这个键值对给插入到服务器 上述的哈希表
3.刚才生成的JSESSIONID又会通过addCookie方法,加入到响应中。此时响应里就会带有Set-Cookie字段,这里的值就是JSESSION=xxxxxxxxx通过响应,就把JSESSIONID返回到浏览器这边了。

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

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

相关文章

轻松掌握Win10录屏技巧:四大神器推荐!

在Win10系统中&#xff0c;录屏功能的应用越来越广泛&#xff0c;无论是用于工作演示、在线教学还是游戏分享&#xff0c;一款好用的录屏软件都是必不可少的。今天&#xff0c;我们将推荐四款录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.foxitsoftware.cn/RE…

字符串大小的比较

1.字符串中每一个字符都对应一个码值&#xff0c;字符串比较大小时从第一个字符开始比较出现结果时输出 如下图所示&#xff1a;

力扣之613.直线上的最近距离

文章目录 1. 613.直线上的最近距离1.1 题意1.2 准备数据1.3 题解1.4 结果截图 1. 613.直线上的最近距离 1.1 题意 表&#xff1a; Point ----------------- | Column Name | Type | ----------------- | x | int | ----------------- 在SQL中&#xff0c;x是该表的主键列。 …

《计算机视觉》—— 换脸

效果如下&#xff1a; 完整代码&#xff1a; import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…

PON架构(全光网络)

目前组网架构 世界上有一种最快的速度又是光&#xff0c;以前传统以太网络规划满足不了现在的需求。 有线网 无线网 全光网络方案 场景 全光网络分类 以太全光网络 PON&#xff08;Pas-sive-Optical Network 无源光网络&#xff09; 再典型的中大型高校网络中 推荐万兆入…

电脑技巧:Rufus——最佳USB启动盘制作工具指南

目录 一、功能强大&#xff0c;兼容性广泛 二、界面友好&#xff0c;操作简便 三、快速高效&#xff0c;高度可定制 四、安全可靠&#xff0c;社区活跃 在日常的电脑使用中&#xff0c;无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务&#xff0c;拥…

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件 一、简介二、.NET Reflector的主要功能包括&#xff1a;1. **反编译**: 反编译是将已编译的.NET程序集&#xff08;如.dll或.exe文件&#xff09;转换回可读的源代码。这使得开发者可以查看和学习第三方库的实现细节&…

【分立元件】电阻的额定电压和最高电压

在文章:【分立元件】贴片电阻的额定功率中我们讲到使用电阻器时,不仅要注意额定功率,还要注意电压相关的一些项目。 本文我们将对与电阻基本参数关联的额定电压和元件最高电压这两个术语及其定义(包括它们之间的关系)进行解说。 额定电压 如下所示国巨片式电阻规…

排序算法 —— 希尔排序

目录 1.希尔排序的由来 2.希尔排序的思想 3.希尔排序的实现 实现分析 实现代码 代码优化 4.希尔排序的总结 1.希尔排序的由来 希尔排序是对直接插入排序的优化。在直接插入排序算法中&#xff0c;如果数据是有序or接近有序的时候&#xff0c;直接插入排序算法的时间复杂…

跨时钟域处理(单bit)_2024年10月21日

慢时钟域同步到快时钟域&#xff1a;打两拍 在快时钟域clk下对慢时钟域信号进行打两拍&#xff08;亚稳态概率很低&#xff09; 脉冲宽度改变&#xff0c;但不影响同步结果 快时钟域同步到慢时钟域&#xff08;两种方法&#xff09; ① 脉冲展宽同步 在快时钟域clk下对快时…

LeetCode199. 二叉树的右视图(2024秋季每日一题 47)

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 提示:…

软件压力测试如何进行?深圳软件测试机构分享

软件压力测试是每个重要软件测试工作的一部分&#xff0c;是一种基本的软件质量保证行为。压力测试不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行软件压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网…

Libevent源码剖析-event

1 简介 本文来重点介绍下libevent中的event事件&#xff0c;在类unix系统中编写网络程序时&#xff0c;我们经常需要处理3类事件-IO事件&signal事件&timer事件&#xff0c;libevent通过reactor来注册&调度&处理IO事件&#xff0c;并且也将signal和timer事件借助…

ESP32开发__ESP-IDF, ESP-ADF官网下载,安装及环境配置

前言 不说废话&#xff0c;直面“干货”。最近公司项目涉及基于 ESP32 系列芯片开发&#xff0c;那我们新手小白如何准备相关工作及快速入门&#xff0c;本篇文章旨在&#xff1a;介绍ESP32&#xff0c;指导用户搭建 ESP32 硬件开发的软件环境&#xff08; ESP-IDF V5.2.1 和 …

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括&#xff1a; Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池&#xff1f;优化的优势 利用反射改造后端代码&#xff0c;AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

Bash 中的 ${} 和 $() 有什么区别 ?

Bash (Bourne-Again SHell) 是一种流行的 Unix SHell&#xff0c;用于编写脚本。如果您使用 Bash 脚本&#xff0c;那么了解不同的语法元素对于提高脚本的效率和避免错误是很重要的。 在本文中&#xff0c;我们将解释 Bash 中 ${} 和 $() 语法之间的区别&#xff0c;并向您展示…

「iOS」——AFNetworking的简单使用

iOS学习 前言原生网络请求使用AFNetworking库进行网络请求具体使用 单例创建的原因单例使用 总结 前言 我们之前学习了通过OC原生内容进行网络申请&#xff0c;AFNetworkikng第三方库的使用&#xff0c;可以极大地简化网络申请的代码量。 原生网络请求 网络请求主要分为上面五…

JAVA单列集合

List系列集合:添加的元素是 有序、可重复、有索引 Set系列集合:添加的元素是 无序、不重复、无索引 Collection Collection是单列集合的接口&#xff0c;它的功能是全部单列集合都可以继承使用的 public boolean add(E e) 把给定的对象添加到当前集合中 public void …

【大数据学习 | Zookeeper】Zookeeper的选举机制

zookeeper的选举机制分为第一次启动和非第一次启动两种情况。 1. 选举机制 - > 第一次启动 (1)服务器1启动&#xff0c;发起一次选举。服务器1投自己一票。此时服务器1票数一票&#xff0c;不够半数以上(3票)&#xff0c;选举无法完成&#xff0c;服务器1状态保持为 LOOKIN…

docker run 命令解析

docker run 命令解析 docker run 命令用于从给定的镜像启动一个新的容器。这个命令可以包含许多选项&#xff0c;下面是一些常用的选项&#xff1a; -d&#xff1a;后台运行容器&#xff0c;并返回容器ID&#xff1b;-i&#xff1a;以交互模式运行容器&#xff0c;通常与 -t …