位置: IT常识 - 正文

Session详解(sessionn)

编辑:rootadmin
Session详解

推荐整理分享Session详解(sessionn),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:session.,session介绍,sessionn,session session,session实例,session的含义,session讲解,session的理解,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

文章目录3、Session3.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、Session3.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查看Session详解(sessionn)

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是用来保存用户登录后的数据

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

本文链接地址:https://www.jiuchutong.com/zhishi/298770.html 转载请保留说明!

上一篇:face_recognition库的使用(face_recognition库采用了什么算法)

下一篇:JS获取各种屏幕的宽度和高度(js获取各种屏幕信息)

  • qq黄钻和svip的区别(qq黄钻和会员)

    qq黄钻和svip的区别(qq黄钻和会员)

  • 怎样在图片上编辑文字(怎样在图片上编辑气泡文字)

    怎样在图片上编辑文字(怎样在图片上编辑气泡文字)

  • 微信好友被删除了聊天记录还能恢复吗(微信好友被删除朋友圈怎么显示)

    微信好友被删除了聊天记录还能恢复吗(微信好友被删除朋友圈怎么显示)

  • word怎么插入空白页

    word怎么插入空白页

  • 手机耳机模式怎么调回来(手机耳机模式怎么取消oppor15)

    手机耳机模式怎么调回来(手机耳机模式怎么取消oppor15)

  • 小米8投屏无反应(小米8不能投屏到电视)

    小米8投屏无反应(小米8不能投屏到电视)

  • 手机充一晚上电了,还没有充满,是什么原因(手机充一晚上电会爆炸吗)

    手机充一晚上电了,还没有充满,是什么原因(手机充一晚上电会爆炸吗)

  • 秘乐短视频交易冻结了怎么办(秘乐短视频交易规则)

    秘乐短视频交易冻结了怎么办(秘乐短视频交易规则)

  • 手机屏幕上有划痕怎么修复(手机屏幕上有划痕能修复吗)

    手机屏幕上有划痕怎么修复(手机屏幕上有划痕能修复吗)

  • 苹果x卡住了强制关机不了(iphone x卡住了)

    苹果x卡住了强制关机不了(iphone x卡住了)

  • 钉钉群不小心退出来了该怎么进去(钉钉群不小心退出群聊)

    钉钉群不小心退出来了该怎么进去(钉钉群不小心退出群聊)

  • 商家七天没发货怎么办(商家七天没发货退款)

    商家七天没发货怎么办(商家七天没发货退款)

  • mate30无线充电多少W(mate30 无线充)

    mate30无线充电多少W(mate30 无线充)

  • 型号a1700是苹果几(苹果的a1700什么意思)

    型号a1700是苹果几(苹果的a1700什么意思)

  • 智慧团建手机登录可以吗(智慧团建手机登录入口电脑版)

    智慧团建手机登录可以吗(智慧团建手机登录入口电脑版)

  • 初中入团申请书怎么写(初中入团申请书1000字左右)

    初中入团申请书怎么写(初中入团申请书1000字左右)

  • 苹果手机自带表格软件在哪(苹果手机自带表情包怎么找)

    苹果手机自带表格软件在哪(苹果手机自带表情包怎么找)

  • 什么是智慧屏(什么是智慧屏电视机)

    什么是智慧屏(什么是智慧屏电视机)

  • 拼多多商家提现多久能到账(拼多多商家提现手续费)

    拼多多商家提现多久能到账(拼多多商家提现手续费)

  • 普通照片怎么添加水印(普通照片怎么添加水印相机的现场照片)

    普通照片怎么添加水印(普通照片怎么添加水印相机的现场照片)

  • qq情侣空间怎么改相恋日期(qq情侣空间怎么隐藏)

    qq情侣空间怎么改相恋日期(qq情侣空间怎么隐藏)

  • 饿了么大牌专享红包怎么用(饿了么大牌专享红包)

    饿了么大牌专享红包怎么用(饿了么大牌专享红包)

  • macOS如何手动添加Windows共享打印机(手动添加mac)

    macOS如何手动添加Windows共享打印机(手动添加mac)

  • Win10提示“病毒和间谍软件定义更新失败”?(win10提示病毒防护已过期)

    Win10提示“病毒和间谍软件定义更新失败”?(win10提示病毒防护已过期)

  • Android Studio安装和使用教程(全文图解)

    Android Studio安装和使用教程(全文图解)

  • Linux下的web服务器搭建(linux中web服务器的安装,配置与测试)

    Linux下的web服务器搭建(linux中web服务器的安装,配置与测试)

  • 土地出让金会涨价吗
  • 出售股东
  • 贴现怎么计算公式
  • 运输费全额抵扣什么意思
  • 分批付款 发票怎么开
  • 劳务工资入什么科目
  • 卷烟批发环节消费税纳税义务发生时间
  • 分包抵扣
  • 支票存根必须盖银行章吗
  • 收到以前年度的政府补助会计分录
  • 固定资产盘亏怎么算
  • 企业呆账的处理方式
  • 商场返现活动怎么入账
  • 住宿发票抵扣怎么做账
  • 公司之间有哪些关系
  • 装修计入固定资产
  • 个人去税局开劳务费需要注意什么
  • 企业允许加计扣除的研发费用主要包括哪些?
  • 人工费用占销售收入比重
  • 假设公司为增值税一般纳税人
  • 固定资产清理销项税
  • 广告业发生错账怎么办
  • 工资可以一次性计提全年的吗
  • 个人独资企业需要缴纳哪些税种
  • 环保税计入项目成本吗
  • 出口布料有退税吗
  • 征地过程中会产生哪些费用
  • 带息的应付票据计算的利息计入财务费用
  • 如何屏蔽骚扰电话和推销电话
  • 跨年的暂估成本怎么冲回
  • 如何创建一个空的dataframe
  • 此windows副本不是正版影响电脑使用吗
  • 财务预提
  • 收到培训内容的英文
  • 怎么检查电脑硬件是否正常
  • Linux中RedHat CentOS Ubuntu Fedora的区别详解
  • php string
  • 增值税留抵退税政策2023
  • 公司购置办公楼自用
  • vuejs axios
  • 如何理性看待国企改革
  • 筹建期的费用计入什么科目
  • 特种设备年检费怎么开具发票
  • 帝国cms专题
  • 织梦如何使用不侵权
  • 织梦cms官网
  • db2 insert timestamp
  • 公司法人与股东的区别
  • 购进国内交通运输产品
  • 利息支出应计入什么科目
  • 租金收入如何分红给股东
  • 各大银行网银转账限额
  • 如何计算税前工资
  • 银行承兑汇票进行贴现的会计分录
  • 发票章摔坏了一个角,还能盖吗
  • 车船税没发票只交可以吗
  • 亏损太多账务如何处理
  • mysql删除的数据恢复
  • win7系统设置wifi热点
  • 如何查看win10版本是不是正版
  • squid服务器配置
  • windows休眠文件
  • linux 系统文件
  • win7如何限制网速
  • linux系统怎么查看防火墙状态
  • android.system.suspend@1.0-service耗电
  • perl 比较符
  • js如何将毫秒转换为日期
  • ercp后淀粉酶为什么升高
  • perl 文件
  • linux安装oracle数据库步骤
  • python算法具有哪五个性质
  • 批量数据验证
  • js表单验证实例怎么写
  • unity教程完整版
  • dom的操作
  • javascript运用
  • JQuery给select添加/删除节点的实现代码
  • 如何在js中实现输入
  • 网约车考试全国过了区域没过
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设