Cookie、Session

一、会话管理

1、什么是会话?

会话是客户端和服务端之间进行多次的请求和响应。

相当于两个人聊天,进行了多次的问答。

对多次问答的管理叫做会话管理,管理的东西是通信状态

2、什么是状态?

举例: 小明去校园食堂买粥,觉得牛奶燕麦粥不错,之后又去买粥了,对食堂阿姨说,还是上次的那种粥。
无状态: 阿姨没有记录小明是否来过,更没有记录小明上次点的是那种粥,只能小明重新说一遍粥的名字。
有状态: 小明来喝粥的时候,阿姨把小明喝的是那种粥记录在小本本上,下次小明再来的时候,阿姨直接查询 小本本,给小明要喝的粥(避免小明早八迟到 )。

3、经典场景

用户在客户端上,进行了登录,之后可能去做一系列的操作,会向服务端发送一系列请求,服务端会判断(判断的是客户端的状态)客户端有没有进行登录?如果是登录的状态有些操作可以做,如果是未登录的状态有些操作是不能做的。

HTTP是无状态的协议,不能记录客户端的状态,这就需要使用Cookie、Session来记录客户端的状态。

4、记录客户端状态图示

Cookie和Session记录客户端状态图示
在这里插入图片描述

二、Cookie

1、概述

Cookie是一种客户端会话技术,Cookie是由服务端产生的,是存放在浏览器上的一小份数据,浏览器每次请求服务器的时,都会携带浏览器中的Cookie。

Cookie的时效性分为:会话级Cookie 和 持久化Cookie。

默认情况下Cookie是会话级别的Cookie,只要浏览器不关闭,Cookie就一直存在。

持久化Cookie,可以设置Cookie的存活时间,就算浏览器关闭,Cookie也不会消失,只有到达存活时间之后Cookie才会消失,可以使用cookie.setMaxAge(int expiry),设置存活时间,参数的单位是“秒”。

设置Cookie的提交路径,只有在请求自己设置的提交路径时,才会携带Cookie值,设置方法cookie.setPath(String path)。

2、原理图

在这里插入图片描述

3、代码测试

ServletA:创建cookie

package com.lyh.servlet;

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;

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie
        Cookie cookie1 = new Cookie("keya","valuea");
        //设置cookie的有效时间
        //cookie1.setMaxAge(60*5);
        //设置cookie的提交路经
        cookie1.setPath("/java_web/servletB");

        Cookie cookie2 = new Cookie("keyb","valueb");

        //将cookie 放入response对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

    }
}

ServletB:获取cookie

package com.lyh.servlet;

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;

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求中携带的cookie
        Cookie[] cookies = req.getCookies();

        //请求中的多个cookie会进入该数组 请求中如果没有cookie cookies数组是null
        if(cookies != null){
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+"="+cookie.getValue());
            }
        }

    }
}

三、Session

1、概述

Session全称叫HttpSession,是保留更多信息在服务端的一种技术,服务端为每一个客户端开辟一块内存空间,就是Session对象,客户端在发送请求的时,都可以使用自己的Session,服务端通过Session来记录每个客户端的状态信息。

Session的时效性默认是30分钟
Session的使用要配合Cookie。

在web.xml中设置Session的失效时间,单位是“分钟”。

<session-config>
     <session-timeout>30</session-timeout>
</session-config>

设置个别session的最大失效时间: session.setMaxInactiveInterval(int var1); 单位是“秒”
直接让session失效: session.invalidate();

应用场景:

  • 记录用户的登录状态。
  • 记录用户的操作历史(购物车)。

2、原理图

在这里插入图片描述

3、 代码测试

Servlet1:获取session 并向session中存储数据。

package com.lyh.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 获取session 并向session中存数据
 */
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收请求中的username参数
        String username = req.getParameter("username");

        //获得session对象
        HttpSession session = req.getSession();

        //设置这个session的失效时间
        session.setMaxInactiveInterval(120);

        //判断请求中有没有一个特殊的cookie JSESSIONID 值**** ****
            //1 有
                // 根据JESSIONID找对应session对象
                    // 1 找到了
                        // 返回之前的session
                    // 2 没找到
                        // 创建一个新的session返回,并且向response对象中存放一个JESSIONID 的cookie
            //2 没有
                // 创建一个新的session返回,并且向response对象中存放一个JESSIONID 的cookie

        //打印一下session的id
        System.out.println(session.getId());
        System.out.println(session.isNew());

        //将username存入session
        //值是 Object类型的,session中 可以存储任何类型的数据
        session.setAttribute("username",username);

        //向客户端响应信息
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("成功");
    }
}

Servlet2:获取session,读取session中存储的数据。

package com.lyh.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得session对象
        HttpSession session = req.getSession();
        System.out.println(session.getId());
        System.out.println(session.isNew());

        //读取session中存储的用户名
        String username = (String) session.getAttribute("username");
        System.out.println("servlet2 得到了 username:" + username);
    }
}

四、三大域对象

域对象: 一些用于存储和传递数据的对象称之为域对象。“域”表示的是不同的范围和区域。每一个范围和区域都可以用不同的对象来代表,这就是域对象。
请求域: HttpServletRequest,传递的数据范围是一次请求之内以及请求转发。
会话域: HttpSession,传递的范围是一次会话之内,可以跨多个请求。
应用域: ServletContext,传递的范围是本应用之内,可以跨多个会话。

生活举例:
1、暖壶摆放在张三的工位上,只有张三一个人可以用——请求域
2、暖壶摆放在办公室的公共区域,这个办公室内的所有人都可以用——会话域
3、暖壶摆放在整个楼层的走廊上,整个楼层的人都可以使用——应用域

域的API:
在这里插入图片描述

所有域图示:
在这里插入图片描述
代码测试实现:
ServletA:向不同域中存放数据

package com.lyh.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletA")
public class ServletA extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //向请求域中存放数据
        req.setAttribute("request","requestMessage");

        //向会话域中存放数据
        HttpSession session = req.getSession();
        session.setAttribute("session","sessionMessage");

        //向应用域存放数据
        ServletContext application = getServletContext();
        application.setAttribute("application","applicationMessage");

        //获得请求域中的数据
        String request = (String) req.getAttribute("request");
        System.out.println("请求域(ServletA):"+request);

        //请求转发到 ServletB 中
        req.getRequestDispatcher("servletB").forward(req,resp);

    }

}

ServletB:获取各种不同域中的数据

package com.lyh.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.io.IOException;

@WebServlet("/servletB")
public class ServletB extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求域中的数据
        String request = (String)req.getAttribute("request");
        System.out.println("请求域:"+request);

        //获取会话域中的数据
        //获得session
        HttpSession session = req.getSession();
        String sessionV = (String)session.getAttribute("session");
        System.out.println("会话域:"+sessionV);

        //获取应用域中的数据
        //获取 application域 对象
        ServletContext application = getServletContext();
        String applicationV = (String) application.getAttribute("application");
        System.out.println("应用域:"+applicationV);
    }

}

这些是我听尚硅谷课程记下的笔记。

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

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

相关文章

QT上位机开发(抽奖软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 用抽奖软件抽奖&#xff0c;是一种很常见的抽奖方式。特别是写这篇文章的时候&#xff0c;正好处于2023年12月31日&#xff0c;也是一年中最后一天…

用html,js和layui写一个简单的点击打怪小游戏

介绍&#xff1a; 一个简单的打怪小游戏&#xff0c;点击开始游戏后&#xff0c;出现攻击按钮&#xff0c;击败怪物后可以选择继续下一关和结束游戏。 继续下一个怪兽的血量会增加5点&#xff0c;攻击按钮会随机变色。 效果图&#xff1a; html代码&#xff1a; <!DOCTYPE…

react + redux 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地&#xff08;内置了基础静态组件和模版&#xff09; git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务&#xff08;内置了json-server&#xff09; npm run serve 启动前端服务 npm…

Python入门学习篇(十四)——模块文件操作

1 模块 1.1 理解 包: python中带有__init__.py文件的文件夹 模块: 文件名(不包含.py后缀),如python官方的time.py中time就是模块1.2 示例代码 import datetime# 调用datetime模块中的datetime类的now()方法 t datetime.datetime.now() # 格式化输出日期和时间 strftime(&qu…

【AI】人类视觉感知特性与深度学习模型(1/2)

目录 一、关于人类视觉感知 1.1 视觉关注 1.自上而下&#xff08;Top-down&#xff09;的视觉关注 ​编辑 2.自下而上&#xff08;Bottom-up&#xff09;的视觉关注 3.区别和记忆点 1.2 视觉掩盖 1.常见的视觉掩盖效应 2.恰可识别失真&#xff08;Just Noticeable Dif…

CentOS:docker同一容器间通信

docker同一容器中不同服务以别名访问 1、创建bridge网络 docker network create testnet 2、查看Docker网络 docker network ls 3、运行容器连接到testnet网络 使用方法&#xff1a;docker run -it --name <容器名> —network --network-alias <网络别名> <…

SpringBoot 一个注解实现数据脱敏

什么是数据脱敏 数据脱敏是指对某些敏感信息&#xff0c;例如姓名、身份证号码、手机号、固定电话、银行卡号、邮箱等个人信息&#xff0c;通过脱敏算法进行数据变形&#xff0c;以保护敏感隐私数据。 数据脱敏通常涉及以下几种主要方法&#xff1a; 替换&#xff1a; 将原始…

table表格中使用el-popover 无效问题解决

实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…

两种方法求解平方根 -- 牛顿法、二分法

Leetcode相关题目&#xff1a; 69. x 的平方根 牛顿法 迭代公式&#xff1a; 以求解 a a a 的平方根为例&#xff0c;可转换为求解方程 f ( x ) f(x) f(x)的根。 f ( x ) x 2 − a f(x)x^2-a f(x)x2−a 迭代公式如下&#xff1a; x n 1 x n − f ( x n ) f ′ ( x n )…

独立站的个性化定制:提升用户体验的关键

随着电子商务的竞争加剧&#xff0c;用户体验成为了企业赢得市场的关键因素之一。独立站作为企业品牌形象和产品展示的重要平台&#xff0c;其个性化定制的程度直接影响着用户体验。本文将探讨独立站的个性化定制如何提升用户体验&#xff0c;并通过代码示例说明实现个性化定制…

第九课:机器学习与人工智能、计算机视觉、自然语言处理 NLP及机器人

第九课&#xff1a;机器学习与人工智能、计算机视觉、自然语言处理 NLP及机器人 第三十四章&#xff1a;机器学习与人工智能1、分类 Classification2、做分类的算法 分类器 Classifier3、用于分类的值是特征 Feature4、特征值种类叫做标记数据 Labeled data5、决策边界 Decisio…

C语言实现关键字匹配算法(复制即用)

文章目录 前言功能要求运行截图全部代码 前言 无套路&#xff0c;均已上机通过&#xff0c;求个关注求个赞&#xff0c;提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中&#xff0c;请统计该文件中关键字出现的频度&#xff0c;并按此频度对关键字进行排序。要…

windows server 2022 启用SYN攻击保护

2023.12.28 SYN攻击是什么&#xff1a; SYN攻击是黑客攻击的常用手段&#xff0c;也是最容易被利用的一种攻击手法&#xff0c;属于DDoS攻击的一种。它利用TCP协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费CPU和内存资源。 SYN攻击包括大量TCP连接的第一个包&…

竞赛保研 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

【c++】使用vector存放键值对时,明明给vector的不同键赋了不同的值,但为什么前面键的值会被后面键的值给覆盖掉?

错误描述 运行程序得到结果如下图所示&#xff08;左边是原始数据&#xff0c;xxml文件中真实数据的样子&#xff0c;右图是程序运行得到的结果结果&#xff09;&#xff1a; 对比以上两图可以发现&#xff0c;右图中两个实例的三个属性值都来自左图中的第二个User实例&#x…

微信商家转账到零钱开通技巧,模板下载

商家转账到零钱是什么&#xff1f; 【商家转账到零钱】功能整合了微信支付之前的【企业付款到零钱】【批量转账到零钱】功能&#xff0c;支持批量对外转账&#xff0c;对有批量对用户付款需求的应用场景更友好&#xff0c;操作便捷。如果你的应用场景是单付款场景的话&#xf…

方太厨电,在创新科技中看见烟火人间

人类的历史&#xff0c;就是一部创新的历史。科普作者马特里德利在《创新的起源&#xff1a;一部科学技术进步史》写道&#xff1a;能源是所有创新之源。 火的发明和使用&#xff0c;就是一种创新&#xff0c;人类第一次通过控制热量的转换来做功&#xff0c;依靠火来取暖和烹饪…

介绍几种mfc140u.dll丢失的解决方法,找不到msvcp140.dll要怎么处理

如果你在使用电脑时遇到mfc140u.dll丢失错误时&#xff0c;这可能会导致程序无法正常运行&#xff0c;但是大家不必过于担心。今天的这篇文章本将为你介绍几种mfc140u.dll丢失的解决方法&#xff0c;找不到msvcp140.dll要怎么处理的一些解决方法。 一.mfc140u.dll文件缺失会有什…

使用IDEA创建maven java项目(hello word)(1.8)

参考资料&#xff1a; idea创建java项目_使用IDEA创建java项目&#xff08;hello word&#xff09;-CSDN博客 ​ 本文代码工程下载链接&#xff1a; https://download.csdn.net/download/xijinno1/87441597 ​ 前提:已安装好jdk,配置好环境变量。我使用的是java 8&#xff08;…

毫秒格式化

## 计算当前毫秒数&#xff1a; const [start,setStart] useState(new Date().getTime())useEffect(()>{setInterval(()>{setCurrMill(new Date().getTime()-start)},1)},[]) ## 格式化毫秒 function formatMilliseconds(milliseconds) {const totalSeconds Math.flo…