【网络编程】servlet和session

news2024/11/20 9:30:43

一、servlet

问题一:两个不同客户端请求同一个 servlet,是创建了两个一模一样的 servlet,然后用完之后全部销毁呢,还是只要一个 servlet,tomcat 开启时创建,关闭时销毁?

结论:当 Tomcat 接收到客户端的 HTTP 请求时,会从线程池中取出一个线程,然后初始化对应的 Servlet 对象,之后调用 service() 方法。要注意的是每一个 Servlet 对象在 Tomcat 容器中只有一个实例对象,即是单例模式。如果多个 HTTP 请求请求的是同一个 Servlet,那么这两个 HTTP 请求对应的线程将并发调用 Servlet 的 service() 方法。

问题二:在 Servlet 中定义成员变量,然后再在方法中对其赋值,那样就能保存一些我想要的信息?

结论:一个 Servlet 在 tomcat 中是单例的形式,即所有请求这个 Servlet 获取的 Servlet 对象是相同的,这么想来,Servlet 中所有的成员变量都是线程不安全的,即所有线程公用这个成员变量。那么是 Servlet 中不能定义成员变量了吗?当然不是,将变量放入 ThreadLocal 中 - - 这样每个线程享用独自的成员变量,即达到了线程安全的目的

二、request

问题一:Controller 层中的几乎每个方法都要参数: HttpServletRequest request,那么为什么不想 server 和 dao 一样直接依赖注入进来呢,这样每个方法不是都不需要这个参数了吗???难道是不能依赖注入吗,还是因为这样搞会导致 request 线程不安全呢???

测试:

img

结论:发现的结论:依赖注入的 request 是单例的(两个不同的请求,但是获取的 request 的 hashcode 确实相同的);但是依赖注入的 request 线程却又是安全的(如果不安全,第二次请求输出的 age 应该也是 20)。

问题二:这里没有把 request 放入 ThreadLocal 中,为什么 request 就变成了线程安全呢???

结论:RequestContextListener 在 servletContext 初始化时为 ThreadLoacl 配置 request 对象,FrameworkServlet 作为兜底策略,保证所有被 DispatcherServlet 处理的 request 在被处理前都被设置到 ThreadLocal 中

猜想:我们可以确定的是这样是可以拿到 request 对象的:

 ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
 HttpServletRequest request = attributes.getRequest();

然后我面点开 RequestContextHolder 的 getRequestAttributes() 方法:

img

发现 RequestAttributes 对象来源于 requestAttributesHolder 成员变量,而 requestAttributesHolder 这个成员变量在 RequestContextHolder 中放在 ThreadLocal 中的

img

三、session

误区一:浏览器关闭,session 真的销毁了吗???

结论:Session 结束生命周期,有以下两种办法:一个是 Session.invalidate() 方法;一个是当前用户和服务器的交互时间超过 session 过期时间后,Session 会失效

误区二:客户端第一次访问服务器,服务器就会立马产生 session 吗???

测试:我们先配置一个 session 监听器 - - - 只要 session 被创建或者销毁都能被监听到,如果有 session 被创建,那么控制台就会输出 session 被创建。

img

然后重启服务器,请求一下–获取验证码–这个接口

img

结果就输出了一个 aaa,并没有输出 session 被创建这句话,说明:不是客户端第一次请求服务器都会创建 session 的,那么怎么样才会创建呢???

这次我们获取一下 sessionid:request.getSession().getId(); - - - 重启服务器

img

结论:这次触发了监听器,这就说明,服务器端只有用到 session 的时候才会去创建 session,并不是客户端第一次请求服务器,服务器就创建 session,然后默认返回 sessionid 作为 cookie。

疑问:为什么首页是 jsp,然后请求服务器,也没用到 session,为什么服务器就创建了 seseion 呢???难道上面的结论是错的吗???

结论:如果 JSP 没有显示的使用 <% @page session=”false”%> 关闭 session,则 JSP 文件在编译成 Servlet 时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true); 这也是 JSP 中隐含的 session 对象的来历。当 JSP 页面没有显式禁止 session 的时候,在打开浏览器第一次请求该 jsp 的时候,服务器会自动为其创建一个 session,并赋予其一个 sessionID,发送给客户端的浏览器。

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

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

相关文章

后端存储实战课——海量数据篇

海量数据导致存储系统慢 拆&#xff0c;将一大坨数据拆分成 N 个小坨&#xff0c;学名「分片」。 归档历史数据 将大量的不常用的历史数据移到另外一张历史表中&#xff0c;大概流程&#xff1a; 批量删除大量数据 不能一次性直接删除&#xff0c;需要分批删除&#xff08;…

SpringBoot【创建与使用】

SpringBoot【创建与使用】&#x1f34e;一.SpringBoot是什么&#x1f352;1.1 SpringBoot的优点&#x1f34e;二.SpringBoot的创建&#x1f352;2.1 使⽤ Idea 中央源创建&#x1f349;2.1.1 下载插件&#x1f349;2.1.2 创建项目&#x1f349;2.1.3 项目的加载&#x1f349;2.…

倪健中:全球元宇宙与中国文化精神 | 钱学森诞辰111周年系列活动开幕仪式

编者按&#xff1a; 倪健中会长出席纪念“中国元宇宙之父”钱学森诞辰111周年线上开幕式并发表了云致辞。 在致辞中&#xff0c;倪会长高度崇敬和赞扬钱学森对中国元宇宙事业做出的伟大贡献。我们因钱老的伟大思想&#xff0c;在探索元宇宙与中国传统文化哲学的融合进程中&…

【Kafka从成神到升仙系列 五】面试官问我 Kafka 生产者的网络架构,我直接开始从源码背起.......

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;Java领域新星创作者&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…

Spring 6 源码编译和高效阅读源码技巧分享

一. 前言 Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布&#xff0c;相信已经有不少同学开始准备新版本的学习了&#xff0c;不过目前还不建议在实际项目中做升级&#xff0c;毕竟还有很多框架和中间件没出适配版本。此次Spring Boot里程碑的升级也要求了最低JDK 17 和…

风靡互联网关键词 Web3.0 | 区块链 | 元宇宙……

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Web web是互联网的总称&#xff0c;全称为World Wide Web&#xff0c;缩写WWW &#xff0c;即全球广域网&#xff0c;也称为万维网&#xff0c;它是一种基于超文本和H…

nacos--基础--1.4--理论--原理

nacos–基础–1.4–理论–原理 1、基本架构 2、Nacos 原理 2.1、信息的同步主要的几种方式 push (服务端主动push)pull (客户端的轮询)&#xff0c; 超时时间比较短long pull (超时时间比较长) 2.2、配置中心原理 nacos 配置中心就是采用&#xff1a;客户端 long pull 的方式…

新体制SAR——BiDi SAR

1. 概述 TerraSAR的相控阵天线具备方位向和距离向二维电扫能力&#xff0c;在这一能力的基础上&#xff0c;TerraSAR可以工作在条带模式、ScanSAR模式、滑聚模式和TOPS模式&#xff08;TOPS是实验模式&#xff0c;不是主模式&#xff09;。载荷的PRF可以设计在3-6.5kHz&#xf…

【笔试强训】Day 7

&#x1f308;欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x…

安科瑞AcrelEMS-SW智慧水务能效管理平台解决方案

系统概述 安科瑞电气具备从终端感知、边缘计算到能效管理平台的产品生态体系&#xff0c;AcrelEMS-SW智慧水务能效管理平台通过在污水厂源、网、荷、储、充的各个关键节点安装保护、监测、分析、治理装置&#xff0c;用于监测污水厂能耗总量和能耗强度&#xff0c;重点监测主要…

2022年史上最全Java面试题:数据结构+算法+JVM+线程+finalize+GC

基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 …

服务端高并发分布式架构演进之路

1. 概述 本文以淘宝作为例子&#xff0c;介绍从一百个到千万级并发情况下服务端的架构的演进过程。同时列举出每个演进阶段会遇到的相关技术&#xff0c;让大家对架构的演进有一个整体的认知。文章最后汇总了一些架构设计的原则。 特别说明&#xff1a;本文以淘宝为例仅仅是为…

如何入门学python,这是很值得借鉴的学习方法

前言 众所周知&#xff0c;python的应用领域十分广泛&#xff0c;无论是对于专业的程序员还是从事其他工作的人&#xff0c;python这门编程语言都非常值得学习。 但对于零基础的人来说&#xff0c;该如何入门python编程呢&#xff1f; 虽然现在网上有关python编程的教程很多…

PyFlink系列之一:PyFlink安装和PyFlink使用的详细技术

PyFlink系列之一&#xff1a;PyFlink安装和PyFlink使用的详细技术一、下载PyFlink二、创建TableEnvironment三、TableEnvironment API1.Table/SQL 操作2.执行/解释作业3.创建/删除用户自定义函数4.依赖管理5.配置四、Catalog APIs五、Statebackend&#xff0c;Checkpoint 以及重…

小程序图片加载失败binderror方法处理

场景&#xff1a;我们在小程序项目中的一个图片列表&#xff0c;当某些图片加载失败后&#xff0c;直接显示空白&#xff0c;这样用户体验不好&#xff0c;为了解决当图片加载失败&#xff0c;我们给一个默认图片代替&#xff0c;参考官方给的图片加载失败的处理方法&#xff1…

C51单片机开发程序报错 main.c (11) : error C267 : ‘Func‘ : requires ANSI-style prototype

问题 C51单片机开发程序报错 main.c (11) : error C267 : Func : requires ANSI-style prototype详细问题 问题一 问题二 问题三 可能原因一 函数定义声明处&#xff08;.h文件中&#xff09;与主函数中函数&#xff08;函数名/参数类型/返回值类型&#xff09;不一致 解决…

【Vue2+Element ui通用后台】项目搭建和vue-router使用

文章目录介绍创建项目并引入Element-ui按需引入全局引入vue-router安装嵌套路由介绍 通过这个系列文章&#xff0c;我们将学到&#xff1a; 1.项目搭建使用element实现首页布局 2.顶部导航菜单及与左侧导航联动的面包屑实现 3.封装—个ECharts组件 4.封装一个Form表单组件和Ta…

木字楠后台管理系统开发(4):SpringSecurity引入并编写登陆接口

&#x1f3b6; 文章简介&#xff1a;木字楠后台管理系统开发(4)&#xff1a;SpringSecurity引入并编写登陆接口 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;冬天来啦&#xff01; &#x1f4dd; 每日一…

在ubuntu上部署gitlab详细步骤

一、Ubuntu安装gitlab步骤&#xff1a; 安装依赖 通过快捷键ctrlaltT打开命令行窗口&#xff0c;然后运行下面两行命令 sudo apt update sudo apt-get upgrade sudo apt-get install curl openssh-server ca-certificates postfix 如果这一步遇到下面提示界面&#xff0c…

BUUCTF Web2

[HCTF 2018]admin flask session的伪造 改密码的页面源码有提示&#xff0c;得到秘钥ckj123 自己的session .eJw9kEGLwjAUhP_KkrOHJm09CB5cbKULeaHwanm5iKu1adK4UBVpxP--XRc8zGmGj5l5sN1paC6GLa7DrZmxXXdkiwf7-GYLptCl2uoOcHWXmDu1kYnGLIFNdQdsBYmtkbb3YI89YDXKUHKNTkCg8S9PliJ…