Session详解

news2024/11/19 13:17:16

在这里插入图片描述

👑 博主简介
   🥇 Java领域新星创作者
   🥇 阿里云开发者社区专家博主、星级博主、技术博主
🤝 交流社区:BoBooY(优质编程学习笔记社区)

前言:上节我们详细讲解了Cookie,这节我们来聊一聊Session,并在最后总结一下Cookie与Session各自的特点和区别。

文章目录

  • 3、Session
    • 3.1、Session的基本使用
      • 3.1.1、概念
      • 3.1.2、Session的工作流程
      • 3.1.3、Session的基本使用
    • 3.2、Session的原理分析
    • 3.3、Session的使用细节
      • 3.3.1、Session钝化与活化
      • 3.3.2、Session的销毁
  • 4、小结

3、Session

3.1、Session的基本使用

3.1.1、概念

Session(服务端会话跟踪技术):将数据保存到服务端。

  • Session是存储在服务端而Cookie是存储在客户端
  • 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
  • 存储在服务端的数据相比于客户端来说就更安全

3.1.2、Session的工作流程

在这里插入图片描述

  • 在服务端的AServlet获取一个Session对象,把数据存入其中
  • 在服务端的BServlet获取到相同的Session对象,从中取出数据
  • 就可以实现一次会话中多次请求之间的数据共享了

3.1.3、Session的基本使用

在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。

  • 获取Session对象,使用的是request对象
HttpSession session = request.getSession();
  • 存储数据到 session 域中
void setAttribute(String name, Object o)

注意:Session中可以存储的是一个Object类型的数据,也就是说Session中可以存储任意数据类型。

  • 根据 key,获取值
Object getAttribute(String name)
  • 根据 key,删除该键值对
void removeAttribute(String name)

《Session使用案例》
  • 创建名为SessionDemo1的Servlet类,编写创建Session的代码
package com.bby;

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;

/**
 * @author BoBooY
 * @date 2022/11/6 15:37
 */
@WebServlet("/demo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建Session对象
        HttpSession session = req.getSession();
        //存储数据
        session.setAttribute("username" , "BoBooY");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
  • 创建名为SessionDemo2的Servlet类,编写获取Session的代码
package com.bby;

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;

/**
 * @author BoBooY
 * @date 2022/11/6 15:41
 */
@WebServlet("/demo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session对象
        HttpSession session = req.getSession();
        System.out.println(session);
        //获取数据
        Object username = session.getAttribute("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
  • 启动项目测试

先访问http://localhost:8080/demo1
再访问http://localhost:8080/demo2

看控制台输出

在这里插入图片描述


3.2、Session的原理分析

Session是基于Cookie实现的

  • 前提条件

在这里插入图片描述

Session要想实现一次会话多次请求之间的数据共享,就必须要保证多次请求获取Session的对象是同一个。

通过刚刚的《Session的使用案例》可以得出以下结论:

  • 两个Servlet类中获取的Session对象是同一个
  • 把demo1和demo2请求刷新多次,控制台最终打印的结果都是同一个

如果新开一个浏览器,访问demo1或者demo2,打印在控制台的Session还是同一个对象吗?

结论:如果是不同浏览器或者重新打开浏览器后,打印的Session就不一样了。所以Session实现的也是一次会话中的多次请求之间的数据共享

Session是如何保证在一次会话中获取的Session对象是同一个呢?

在这里插入图片描述

(1)demo1在第一次获取session对象的时候,session对象会有一个唯一的标识,假如是id:10

(2)demo1在session中存入其他数据并处理完成所有业务后,需要通过Tomcat服务器响应结果给浏览器

(3)Tomcat服务器发现业务处理中使用了session对象,就会把session的唯一标识id:10当做一个cookie,添加Set-Cookie:JESSIONID=10到响应头中,并响应给浏览器

(4)浏览器接收到响应结果后,会把响应头中的coookie数据存储到浏览器的内存中

(5)浏览器在同一会话中访问demo2的时候,会把cookie中的数据按照cookie: JESSIONID=10的格式添加到请求头中并发送给服务器Tomcat

(6)demo2获取到请求后,从请求头中就读取cookie中的JSESSIONID值为10,然后就会到服务器内存中寻找id:10的session对象,如果找到了,就直接返回该对象,如果没有则新创建一个session对象

(7)关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JESSIONID的数据,服务端获取到的session就是一个全新的session对象


《实际演示》
  • 使用谷歌浏览器访问http://localhost:8080/demo1,并按下F12查看

在这里插入图片描述

  • 使用谷歌浏览器访问http://localhost:8080/demo2,并按下F12查看

在这里插入图片描述

3.3、Session的使用细节

在使用Session时注意下面两点细节:第一个是Session的钝化和活化,第二个是Session的销毁

3.3.1、Session钝化与活化

由于Session对象是存储在服务器内存中的,所以Session中的数据在重启服务器后就会被释放,Session对象也会被销毁。

  • Session对象被销毁会引发什么问题?

当我们在购物车购物时,我们因为打电话等其他原因导致付钱的动作被搁置,这时服务器重启了,Session对象消失了,我们的数据也没了,这就会导致很不好的影响,所以我们需要在服务器即使重启的情况下也要将用户的数据保存下来。


《测试正常启动和关闭Tomcat服务器,Session会不会消失》
  • 正常启动Tomcat(使用Maven Helper插件)

在这里插入图片描述

进入到项目文件夹中,在终端使用以下命令:

mvn tomcat7:run

注:若启动失败,尝试清除浏览器本地Cookie缓存

访问http://localhost:8080/cookie-demo/demo1,再访问http://localhost:8080/cookie-demo/demo2,查看控制台输出

在这里插入图片描述

  • 正常关闭Tomcat服务器:Ctrl + c
  • 再次启动,访问http://localhost:8080/cookie-demo/demo2,查看控制台输出

在这里插入图片描述

经过测试,只要服务器是正常关闭和启动,session中的数据是可以被保存下来的,原因就是Session的钝化和活化


  • 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中

钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser

在这里插入图片描述

  • 活化:再次启动服务器后,从文件中加载数据到新的Session中

数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉

小结

  • session数据存储在服务端,服务器重启后,session数据会被保存

  • 浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新的对象

  • session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存数据

  • cookie是存储在客户端,是可以长期保存

3.3.2、Session的销毁

session的销毁会有两种方式:

  • 默认情况下,无操作,30分钟自动销毁

可以在web.xml文件中配置修改失效时间(单位:分钟

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <session-config>
        <session-timeout>100</session-timeout>
    </session-config>
</web-app>

如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中写死的

在这里插入图片描述

  • 调用Session对象的invalidate()进行销毁

在SessionDemo2类中添加session销毁的方法

@WebServlet("/demo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取数据,从session中

        //1. 获取Session对象
        HttpSession session = request.getSession();
        System.out.println(session);

        // 销毁
        session.invalidate();
        //2. 获取数据
        Object username = session.getAttribute("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

该销毁方法一般会在用户退出的时候,需要将session销毁掉。

4、小结

Cookie和Session共同目标:Cookie 和 Session 都是来完成一次会话内多次请求间数据共享的。

Cookie和Session的区别

  • 存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
  • 安全性:Cookie不安全,Session安全
  • 数据大小:Cookie最大3KB,Session无大小限制
  • 存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
  • 服务器性能:Cookie不占服务器资源,Session占用服务器资源

Cookie和Session的应用场景

  • 购物车:使用Cookie来存储
  • 以登录用户的名称展示:使用Session来存储
  • 记住我功能:使用Cookie来存储
  • 验证码:使用session来存储

结论

  • Cookie是用来保证用户在未登录情况下的身份识别
  • Session是用来保存用户登录后的数据

尾言:创作不易,如果本文的内容对您有帮助,还望客官可以三连支持一下博主,👍(点赞)+✏️(评论)+⭐️(收藏)是我创作的巨大动力!

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

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

相关文章

华为云从入门到实战 | 云服务概述与华为云搭建Web应用

云计算在快速发展过程中逐渐形成了不同的服务模式(Service Model)。根据云计算最终服务的交付形态主要分为3种类型,软件即服务、平台即服务与基础架构即服务。从根源上来说,云计算的服务模式来源于面向服务的架构SOA(Service-Oriented Architecture)。所谓SOA,就是一种架构设…

npm install或npm i后没有依赖包node_modules?

今天git clone一个项目发现npm i后发现自己的文件下面没有node_modules包&#xff0c;但是有如图提示&#xff1a;但是文件夹下没有任何新增文件 added 1 package in 674ms 随后查看了C:\Users\俊\AppData\Roaming\npm\node_modules 图一&#xff1a; 里面存在今天执行npm i…

微信小程序实训|基于云数据库的语文听写工具

本实训项目结合云开发的云数据库和 “微信同声传译”插件&#xff0c;制作一个可真实运营的小学生语文听写工具&#xff0c;页面效果如图1所示。 ▍图1 “听写小助手”页面 基于云开发的微信小程序具有众多优势&#xff0c;云开发模式真正解放了开发者&#xff0c;使得开发效率…

Vue3全家桶入门 (通过vue-cli脚手架搭建todolist项目环境,深入vue3.0核心知识)

目录 一、todolist项目准备 vue3.0环境搭建&#x1f344; 二、todolist基本结构 1. 定义组件&#x1f437; 2.实现todolist需要用到的四个组件 &#x1f436; 3.ref定义单个数据 &#x1f42d; 4.reactive定义对象类型的数据&#x1f439; 5. 实现todolist每个组件需要…

前端实战【ES6】你会ES6,但是你真的会用吗?

目录&#x1f31f;前言&#x1f31f;关于取值&#x1f31f;关于合并数据&#x1f31f;关于拼接字符串&#x1f31f;关于if中判断条件&#x1f31f;关于列表搜索&#x1f31f;关于扁平化数组&#x1f31f;关于获取对象属性值&#x1f31f;关于添加对象属性&#x1f31f;关于输入…

vue父子组件传值:父传子、子传父

最近项目中又需要用到父子组件&#xff0c;用了很多次之后对父子组件终于有种从善如流的感觉。会了之后再看自己写的父子组件传值的文章&#xff0c;感觉还是存在很多问题的&#xff0c;问题就不改了&#xff0c;在这篇文章做个总结和纠正吧。 父子组件就是在一个vue文件中引入…

瑞吉外卖项目:编辑员工信息与公共字段自动填充

目录 一. 编辑员工信息 1.1 需求分析 1.2 代码编写 执行流程 后端代码 二. 项目公共字段填充 2.1 问题分析 2.2 代码实现 2.3 功能完善 一. 编辑员工信息 1.1 需求分析 在员工管理列表点击编辑按钮&#xff0c;跳转至编辑页面后&#xff0c;回显员工数据进行修改。 …

前端开发利器--PxCook(像素大厨)

前端开发利器 - - PxCook&#xff08;像素大厨&#xff09;1、PxCook简述2、PxCook安装3、PxCook基本操作3.1 通过软件打开设计图3.2 常用快捷键3.3 常用工具3.4 从psd文件中直接获取数据1、PxCook简述 前端开发软件&#xff1a; PS&#xff08;Photoshop&#xff09;收费、占…

【SVG】路径<Path>标签详解,一次搞懂所有命令参数

在上一篇文章 什么是SVG&#xff1f;——SVG快速入门 中我对SVG做了基础的介绍&#xff0c;这篇文章将集中讲解<path>标签 本站链接&#xff1a;什么是SVG&#xff1f;——SVG快速入门_gxyzlxf的博客-CSDN博客 稀土掘金链接&#xff1a;什么是SVG&#xff1f;——SVG快…

npm修改默认源(默认镜像)

1 npm修改默认源(默认镜像) 首先如果之前安装过node.js的需要先卸载&#xff0c;删除npm原始默认安装目录&#xff08;在cmd命令面板执行 npm config ls 查看npm默认路径&#xff09; 在cmd命令面板中输入npm config ls 查看npm默认路径 删除操作如下所示&#xff1a; 重新安…

js实现base64,url,blob之间的相互转换

一般来说前端展示图片会通过三种方式&#xff1a; url、base64、blob 1.url: 一般来说&#xff0c;图片的显示还是建议使用url的方式比较好。 let url "http://xxxxxx" 2.base64&#xff1a; 如果图片较大&#xff0c;图片的色彩层次比较丰富&#xff0c;则不适合…

【原创】基于JavaWeb的医院预约挂号系统(医院挂号管理系统毕业设计)

项目介绍&#xff1a;后端采用JspServlet。前端使用的是Layui的一个网站模板。开发一个在线的医院预约挂号系统。从角色的划分&#xff0c;包括用户、医生、管理员。功能模块上包括了公告发布、医院信息查看、医院医生信息查看、预约医生、病例记录、挂号审核、图表统计等模块。…

css常见居中方法总结

最近跟着网上的教程做了几个网页项目&#xff0c;做的过程中关于居中涉及到了好几种方法&#xff0c;遂想将其总结归纳下来&#xff0c;一是理清自己的思路&#xff0c;二是希望能分享给需要帮助的小伙伴们。 话不多数&#xff0c;直奔主题。 本次涉及到的居中方法有七种&…

微信小程序嵌入 H5 页面(web-view)

在开发微信小程序的时候&#xff0c;我们有时候会遇到将 H5 页面嵌入到小程序页面中的情况&#xff1b;微信小程序自带的 web-view 组件相当于 HTML 页面中的 iframe &#xff0c;方便我们在微信小程序中打开一个 H5 页面&#xff1b; 官网描述&#xff1a; 承载网页的容器&a…

微前端(无界)

前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现有方案&#xff0c;在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题&#xff0c;或无法提供支持。本…

vue项目中引入Luckysheet

Luckysheet 介绍 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 实现功能 格式设置 样式 (修改字体样式&#xff0c;字号&#xff0c;颜色或者其他通用的样式)条件格式 (突出显示所关注的单元格或单元格区域&#xff1…

微信小程序(5)——如何制作好看的表格

✅ 因为 “表格” 在日常统计中无处不在&#xff0c;所以今天来做一做。但是微信小程序不支持 table 标签&#xff0c;我准备用 “上一篇——Flex布局” 学的 flex 来实现一下。 文章目录一、从“html的table”到 “微信小程序的table”二、统一格式的表格三、非统一格式的表格…

【vuex】unknown action type:home/categoryList报错

记录一下今天遇到的bug。在做项目时&#xff0c;想进行vuex模块化开发。 在src/store下暂且建了两个小仓库home和search src/store/index.js import {createStore} from vuex; // 引入小仓库 import home from /store/home/index import search from /store/search/index// 对…

vue3.0运行npm run dev 报错Cannot find module ‘node:url‘

目录 一、问题描述&#xff1a; 二、原因 三、解决方案 一、问题描述&#xff1a; 学习vue3.0&#xff08; Vue.js - 渐进式 JavaScript 框架 | Vue.js&#xff09;的时候一直使用的家里电脑&#xff0c;项目搭建运行一直没问题&#xff0c;公司近期用vue3.0写项目 npm init…

(前后端都开源)Activiti Flowable Camunda json转bpmn 仿钉钉流程设计器 vue2vue3 Ant Design Wflow-web smart-flow-design

仿钉钉流程设计器前后端源码 2022年10月17日,重磅开源! 话不多说上码云项目链接,各位觉得有帮助可以点一个star 本项目是基于这个Flowable6.7.2实现的, 后面会开一个Activiti567的分支 本项目在码云地址: Flowable-Activiti仿钉钉流程设计器前后台源码--工作流中台项目-基于…