JSP、Servlet的Session到底什么时候创建?登录与验证到底和Session有什么关系?

1 测试1[2024-5-23-9:00]

两次获取Session,第一次在查询到用户名密码是否与数据库数据匹配之前,即没有显式地getSession之前;

第二次在查询到用户名密码与数据库数据匹配,显式地getSession之后。

未通过登录验证的Session

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

通过登录验证的Session

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

结论

Session生命周期并不是从第一次执行req.getSession()时创建,这里的第一次指的是程序员第一次显式地在后端程序中写req.getSession()

[2024-5-23-11:02]进一步补充:

流程是服务器启动->自动访问index.jsp->点击登录,访问login.jsp->输入用户名密码->发送servlet请求->后端处理,打印两次session

这个session是由jsp自动创建的,即在自动访问index.jsp时,就已经有了,详见测试2

2 测试2[2024-5-23-10:50]

<%@ page session="ture" %>(默认的,没有显式写出来)

访问index.jsp

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

index.jsp中加一句<%@ page session="false" %>

访问index.jsp

在这里插入图片描述

在这里插入图片描述

再访问login.jsp

login.jsp没加<%@ page session="false" %>,默认会创建session
在这里插入图片描述

在这里插入图片描述

结论

一定程度说明,jsp的本质是servlet

3 GPT-Session的自动创建

是的,自动创建Session以备不时之需确实是一个合理的解释。让我们深入探讨一下这种自动创建Session的行为及其背后的原因。

自动创建Session的原因

  1. 状态管理的需要

    • Web应用需要在多个请求之间保持一些用户的状态信息,如购物车内容、表单数据、用户偏好等。
    • 即使当前请求没有显式使用Session,未来的请求可能会需要Session。因此,提前创建Session可以确保状态管理的准备工作已经完成。
  2. 简化开发

    • 自动创建Session可以简化开发工作,开发人员不必显式地在每个需要状态管理的请求中创建Session。
    • 开发人员可以随时调用request.getSession()而不需要担心Session是否已经创建。
  3. 默认行为

    • 某些容器和框架的设计默认是为了简化开发流程,因此会在合适的时机自动创建Session。
    • 这种行为确保了一致的用户体验和简化的状态管理。

具体示例和行为

JSP页面自动创建Session

在JSP页面中,默认情况下Session是启用的。这是为了确保在页面中使用Session相关功能(如存储用户信息)时,不会因为Session未创建而导致问题。

<%@ page session="true" %>
Servlet自动创建Session

即使在Servlet中没有显式地调用request.getSession(),当某些框架或过滤器需要使用Session时,它们会隐式地调用getSession()方法,这就触发了Session的创建。

实际应用中的影响

用户登录示例

即使在用户未登录的情况下,自动创建Session可以确保未来的请求中,服务器能够方便地存储和访问用户的临时数据。

示例代码

假设你有一个简单的Servlet,它没有显式创建Session:

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 没有显式创建Sessionresponse.getWriter().println("Hello, World!");}
}

尽管在代码中没有调用request.getSession(),但响应中可能仍包含Set-Cookie头,这意味着Session已经被创建。

使用过滤器或框架时的Session创建

一些过滤器或框架可能在处理请求时隐式地调用了getSession(),例如:

  • 安全过滤器:检查用户是否已登录。**【注释】**检查登录肯定要看session里边有没有用户,一旦请求,即使没有也会创建(getSession()默认参数为true)
  • 用户跟踪:记录用户的访问路径和行为。
  • 临时数据存储:如购物车、表单数据等。

这些场景下,即使你在Servlet中没有显式创建Session,框架或过滤器的工作机制也会导致Session的创建。

控制Session的创建

如果你不希望自动创建Session,可以在JSP页面中禁用Session,或者在Servlet中避免调用request.getSession(),并确保框架和过滤器不会隐式创建Session。

禁用JSP页面中的Session
<%@ page session="false" %>
确保Servlet不创建Session

确保在Servlet代码中没有调用request.getSession()

总结

  • 自动创建Session的目的:为了简化开发,确保在未来请求中需要状态管理时Session已经准备好。
  • 常见场景:JSP页面、使用框架和过滤器时会自动创建Session。
  • 控制创建:可以通过配置和代码避免不必要的Session创建。

这种自动创建Session的机制可以确保Web应用在处理状态管理时更加灵活和可靠。**【注释】**可把初学者害惨了

4 登录验证与自动登录

登录验证

单纯的登录验证并不一定需要Session的参与,如果只是简单地控制页面跳转。

功能1 根据登录信息跳转(单纯跳转,并不需要Session)

UserServlet

登录信息匹配------>跳转到相关页面

登录信息不匹配---->跳转到失败页面

功能2 页面右上角展示用户相关信息(需要用到Session)

UserServlet

登录信息匹配------>将登录信息存到session,跳转到相关页面

用户信息展示------>相关页面从session中获取到用户信息并展示

或者不用Session使用转发(重定向不行):

UserServlet

登录信息匹配------>将登录信息存到request,跳转到相关页面

用户信息展示------>相关页面从request中获取到用户信息并展示

本质就是借助域对象存储信息,实现信息的“持久化”

域对象的范围:

  • request的范围只在转发中有效。

  • session的范围是当前这个用户的所有操作都有效。

  • servletContext的范围整个项目都有效。

使用原则:

小的范围能完成功能就放到小的里面。

结合过滤器

LoginFilter

只有少输页面可以不登录访问(过滤器直接放行),对于大多数页面,先要能够通过过滤器才能访问到。

如何通过过滤器?自己写放行条件,一般是是否登录,即从Session中获取登录信息,有就是登录,放行;没有就是未登录,拦截。

过滤器是访问每一个未放行的页面都会存在的,实现一次登录,随意访问的效果,第一次登录将用户名密码存到Session中,

过滤器每次从Session中获取用户名密码并验证,决定是否放行,是一个比较好的做法。

思考:

request是不是也能做?

可以但麻烦且危险,每次请求页面附上用户名密码,然后filter从req里边验证用户名密码

不能一次登录省事

自动登录

即使关闭浏览器,再次访问页面自动完成登录

cookie持久化,定义好路径,发送请求时一起带过去,当请求需要判断是否登录的资源时,根据cookie中的信息,执行登录操作(请求session但是空的,然后执行登录)

还有一个思路(未验证):保存我的sessionid,这样就能直接找到已经存有登录信息的session,不用再去和数据库比对等操作的。(如果密码修改了呢?)

filter只登录没有放行:

需要第二次访问页面才可以出现信息

只从cookie中拿到用户名密码进行了登录,并没继续对这也页面请求的处理,没有放行。

在这里插入图片描述

在这里插入图片描述

5 对于session处理的再思考

modifyPassword修改密码会直接删除SessionManager中所有该用户id关联的记录(键值对),

LoginFilter过滤器会主动查找user对应的session是否可用(是否有键值对),没有则删除该session并重定向至登录;

用户主动注销不会影响session,只是移除其中的user属性;

为了效率->只要user!=null就放行,没有进一步验证->一个账号多处登录,其中一端改密,其他端登录状态不会受到影响->引入会话管理 ->将userid与sessionid绑定->user!=null且会话管理键值对“有效”(存在)才放行->改密时userid所有的键值对标记为“失效”(删掉) ->user!=null且没记录,整个删除session结束会话->重新登录->完成

或者可以在user!=null且没记录时,不删掉整个session,而是移除user属性并重定向,应该也可以实现同样的效果

因为session并不是全局存储结构,一个会话中没法看到其他session,所以没法直接通过遍历所有session并移除user属性的方法, 必须借助一个“全局存储结构”存储每个用户的session,并以此为标记来实现会话同步

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

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

相关文章

【网络安全的神秘世界】VsCode直连虚拟机

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 通过VsCode连接虚拟机&#xff0c;可以进行远程操作 在vscode里安装以下插件&#xff1a; Docker Dev Containers Remote Development Remote ssh 配…

Execl数据导入 EasyExcel实现

官网 1. 需求简介 读取下面表格数据 第一行和第二行是计划信息 第三行是计划详情的抬头信息,以下行是计划详情信息 总段包含多个分段,总段使用了单元格合并功能 2. 实现读取功能 2.1 引入easyexcel依赖 <dependency><groupId>com.alibaba</groupId><…

分享几个好用的网站、软件

1、果核剥壳 https://www.ghxi.com 果核剥壳是一家综合科技站点&#xff0c;看新闻&#xff0c;分享破解软件、绿色软件&#xff0c;Windows系统。守住互联网最后的一片净土。 2、小众软件 https://www.appinn.com 小众软件是一个分享免费、小巧、有趣、实用软件的网站&…

Hugo搭建博客和部署全流程—Congo主题和优化

欢迎来到我的全新博客&#xff1a;探索科研、创业和日常——Hugo搭建博客、部署和优化全流程 &#x1f30f; Demo site: https://sylvanding.online/ ⭐️ Repo: https://github.com/sylvanding/sylvanding.github.io 我的博客使用Hugo搭建&#xff0c;选择Congo主题&#xff0…

为什么25+胶原蛋白会流失?

随着年龄的增长&#xff0c;特别是当我们步入25岁之后&#xff0c;胶原蛋白的流失问题逐渐凸显&#xff0c;成为影响皮肤健康和外观的重要因素。以下将从几个方面详细解释胶原蛋白流失的原因&#xff1a; 一、年龄增长 胶原蛋白是皮肤的主要支撑结构&#xff0c;但随着年龄的增…

身边消失的超市越来越多!盒马、山姆也卷出历史新高度

不知不觉&#xff0c;身边不少老牌连锁超市都在忽然之间消失得无影无踪。 前不久&#xff0c;山姆又发布了长期降价清单&#xff0c;而随着山姆又一次降价&#xff0c;盒马也再一次被推上了风口浪尖。事实上&#xff0c;作为国内市场两大头部仓储会员超市&#xff0c;盒马与山…

数据挖掘与机器学习——分类算法

目录 机器学习算法最普通分类&#xff1a; 分类算法的定义&#xff1a; 分类算法的应用&#xff1a; 分类器实现分类&#xff1a; 分类器的构建标准&#xff1a; 概率模型&#xff1a; 贝叶斯公式&#xff1a; 朴素贝叶斯算法&#xff08;朴素贝叶斯分类器&#xff09;…

一文了解JavaScript 中数组所有API的使用

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 JavaScript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 这篇文章…

【八股】在Gradle和Maven之间抉择构建工具

在Java开发中&#xff0c;Gradle和Maven是两种常用的构建工具&#xff0c;它们在许多方面有不同的特点和使用场景。以下是它们之间的一些主要区别&#xff1a; 构建脚本 Maven&#xff1a;使用XML文件&#xff08;pom.xml&#xff09;来定义项目的构建配置。XML的语法严格且具…

【每日刷题】Day55

【每日刷题】Day55 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 441. 排列硬币 - 力扣&#xff08;LeetCode&#xff09; 2. 455. 分发饼干 - 力扣&#xff08;Leet…

centos系统清理docker日志文件

centos系统清理docker日志文件 1.查看docker根目录位置2.清理日志 1.查看docker根目录位置 命令&#xff1a;docker info ,将Docker Root Dir 的值复制下来。如果目录中包含 等特殊符号的目录&#xff0c;需要转义 2.清理日志 创建文件&#xff1a;vim docker_logs_clean.…

BBC 超2.5万员工敏感数据泄露

近日据外媒报道&#xff0c;英国广播公司 (BBC) 发生了严重的数据泄露事件&#xff0c;了超 25,000 名现任和前任员工的敏感个人信息泄露。 BBC 表示&#xff0c;此次泄密源于第三方云数据存储服务中的私人记录被非法访问。 BBC 表示&#xff1a;“正在与内部和外部的专家团队…

2024-6-4 石群电路-23

2024-6-4&#xff0c;星期二&#xff0c;13:16&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天又是阳光明媚的一天&#xff0c;没有什么特别的事情发生&#xff0c;加油学习喽~ 今日观看了石群老师电路课程的第39和第40个视频&#xff0c;继续第九章的学…

vulnhub靶机xptosystem

下载地址&#xff1a;https://download.vulnhub.com/xpto/xptosystem.ova 主机发现 端口扫描 服务扫描 漏洞扫描 看一下web 目录爆破 那不用说肯定看看robots.txt 要检查readme去看看 看不懂 这个是靶场吧很像 在最后看着挺像url路径的 还真是&#xff0c;我直接base64 坏了还…

TS 小技巧: 使用元组生成联合类型

前言 在我们使用 TypeScript 开发业务的时候&#xff0c;也许你会遇到一个这样的问题&#xff1a;我们如何根据一个数组的值得到一个联合类型&#xff1f; 这里向大家介绍一个开发小技巧&#xff1a;使用元组生成联合类型 开发场景 我们看下面一段 ts 代码&#xff1a; con…

Linux设备驱动platform驱动

更全面的内容可以查看我的github 提供了示例代码 platform设备驱动 Linux 系统要考虑到驱动的可重用性&#xff0c;因此提出了驱动的分离与分层这样的软件思路&#xff0c;为了达到所有硬件都可以按照总线设备驱动模型来实现驱动&#xff0c;Linux从2.6起就加入了 platform 设…

8086 汇编笔记(八):转移指令的原理

一、操作符 offset 操作符offset在汇编语言中是由编译器处理的符号&#xff0c;它的功能是取得标号的偏移地址 codesg segmentstart: mov ax,offset start ;相当于 mv ax,0s: mov ax,offset s ;相当于 mv ax,3codesg endsend start 二、jmp 指令 jmp为无条件…

【面试宝藏】容器技术详解其二

Docker与容器化技术详解 15. Docker Image 和 Docker Layer&#xff08;层&#xff09;有什么不同&#xff1f; Docker Image&#xff1a;Docker镜像是一个不可变的文件&#xff0c;包含应用程序的所有依赖项、库、配置和环境变量。它是运行Docker容器的基础&#xff0c;包含…

每天一个数据分析题(三百五十)

在“人货场”的业务模块下&#xff0c;有可能成为描述“场”的情况的相关数据表是 A. 订单表 B. 订单详情表 C. 客户详情表 D. 区域表 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案

【二叉树】Leetcode 222. 完全二叉树的节点个数【简单】

完全二叉树的节点个数 你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最…