手写Tomcat(一)

news2025/5/29 11:37:45

一、Tomcat简介 

Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

1.1 Tomcat基本架构

Servlet接口文件中定义的方法有以下几个:

  • init():初始化Servlet
  • getServletConfig():获取Servlet配置信息
  • service():服务..........
  • getServletInfo():获取Servlet的运行信息
  • destroy():销毁,回收内存

补充: 

  • Servlet是接口文件,定义方法不需实现,通过其子类即GenericSrevlet(抽象类)及HttpSrevlet(抽象类)进行实现。
  • 补充:抽象类中可以写抽象方法,也可以写实现方法,同时可以不实现接口中定义的全部抽象方法。

GenericSrevlet类中实现了init()、getServletConfig()、getServletInfo()、destroy()四个方法,把service()交由HttpSrevlet实现。

为什么在HttpSrevlet中实现service()方法? 

HttpServlet中关于 service()定义如下: 

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

HttpServlet中定义service()是为了更好的匹配当前http的请求方式。

二、Tomcat简化模型构建知识补充

2.1 HTTP协议

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。

2.1.1 请求部分

请求部分包括请求头、请求方式、请求内容,如请求方式等可以进行选择,但是在发送请求时不能删减。

2.1.1.1 请求头

注:可以通过f12,选择网络进行查看。

2.1.1.2 请求方式

 GET

  • 用途获取资源(查询数据),参数通过 URL 的 Query String 传递(如 /users?id=123)。

  • 特点

    • 可见性:参数暴露在 URL 和浏览器历史中。

    • 长度限制:由浏览器和服务器共同决定(如 IE 限制为 2048 字符,Chrome 约 8KB),并非 HTTP 协议规定

    • 幂等性:多次请求结果相同(不修改资源)。

  • 安全建议:避免用 GET 传输敏感信息(密码、Token)。

POST 

  • 用途提交数据(创建或修改资源),参数在 请求体 中(支持多种编码格式,如 form-dataJSON)。

  • 特点

    • 无长度限制:理论上由服务器配置决定。

    • 非幂等性:多次提交可能产生不同结果(如重复创建订单)。

    • 相对安全误解:HTTP 明文传输下,POST 请求体仍可被拦截。真正的安全需依赖 HTTPS

  • 常见场景:表单提交、文件上传、复杂数据(如嵌套 JSON),一般用来做增删改操作。                                                                                                                                 

HEAD 

  • 用途:获取资源的 元数据(响应头),不返回响应体。

  • 典型应用

    • 检查资源是否存在(通过状态码 200 或 404)。

    • 验证资源是否修改(通过 Last-Modified 或 ETag 头)。

    • 预加载资源信息(如 Content-Length 用于进度条)。

OPTIONS

  • 用途询问服务器支持的 HTTP 方法 或 CORS 预检请求

  • CORS 预检

    • 浏览器在跨域请求前自动发送 OPTIONS 请求。

    • 服务器需返回 Access-Control-Allow-Methods 等头,声明允许的方法、头、源。

    • 示例:Access-Control-Allow-Methods: GET, POST, PUT

PUT

  • 用途完整替换资源(全量更新)。

  • 幂等性:多次请求结果一致(如更新用户信息为固定值)。

  • 与 POST 区别

    • POST 用于创建资源时,URI 由服务器决定(如 /users)。

    • PUT 需客户端指定完整资源路径(如 /users/123)。

PATCH

  • 用途局部更新资源(如只修改用户的邮箱)。

  • 非幂等性:连续多次局部更新可能导致意外结果(如递增计数器)。

  • 实现方式:需定义数据格式(如 JSON Patch 标准)。

DELETE

  • 用途删除指定资源

  • 幂等性:多次删除同一资源结果相同(首次返回 200 或 204,后续可能返回 404)。

  • 注意:实际业务中常采用 逻辑删除(标记为删除状态)而非物理删除。

TRACE

  • 用途:回显客户端请求,用于调试。

  • 安全风险:可能引发 跨站追踪攻击(XST),多数服务器默认禁用。

CONNECT

  • 用途:建立到目标服务器的 隧道连接,用于代理 HTTPS 流量。

  • 工作流程

    1. 客户端发送 CONNECT example.com:443 HTTP/1.1

    2. 代理服务器建立 TCP 连接到目标服务器。

    3. 后续数据直接透传(用于 TLS 加密通信)

关键对比总结

特性GETPOSTPUTPATCHDELETE
幂等性✔️✔️✔️
安全性
数据位置URLBodyBodyBodyURL

 

2.1.2 响应部分

响应部分包括响应头、响应状态、响应内容。

2.1.2.1 响应头

注:可以通过f12,选择网络进行查看。

2.1.2.2 响应状态
  • 200:ok
  • 404:url出错
  • 500:服务器内部错误
2.1.2.3 响应内容

响应内容就是传输的内容。

2.2 数据传输

在tomcat中,接口信息及参数等的数据传递的底层通过I/O实现,随后将数据给到ServletRequest/ServletReqsponse。

2.2.1 request

request中接受的信息(仅列举一部分):

  • method:请求方式
  • 编码方式:如JSON
  • data:parameter
  • url:请求地址
  • cookie:获取登录信息

2.2.2 response

response中包含的信息(仅列举一部分):

  • 状态码
  • 编码方式:如JSON
  • 字符集:如utf-8
  • data数据

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

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

相关文章

【机器学习基础】机器学习入门核心算法:支持向量机(SVM)

机器学习入门核心算法&#xff1a;支持向量机&#xff08;SVM&#xff09; 一、算法逻辑1.1 基本概念1.2 核心思想线性可分情况 二、算法原理与数学推导2.1 原始优化问题2.2 拉格朗日对偶2.3 对偶问题2.4 核函数技巧2.5 软间隔与松弛变量 三、模型评估3.1 评估指标3.2 交叉验证…

定时清理流媒体服务器录像自动化bash脚本

定时清理流媒体服务器保存录像文件夹 首先创建一个文件,解除读写权限 touch rm_videos.sh chmod 777 rm_videos.sh将内容复制进去&#xff0c;将对应文件夹等需要修改的内容&#xff0c;根据自己的实际需求进行修改 #!/bin/bash# 设置目标目录&#xff08;修改为你的实际路…

Logi鼠标切换桌面失效

Mac上习惯了滑屏切换桌面&#xff0c;所以Logi鼠标也定制了切换桌面的动作&#xff0c;有一天发现这个动作失效了&#xff0c;且只有切换桌面的动作失效。 发现Logi Options出现了这个提示&#xff0c;如图所示&#xff08;具体原因未知&#xff0c;已配置不自动更新版本&…

2025年全国青少年信息素养大赛复赛C++集训(15):因子问题(题目及解析)

2025年全国青少年信息素养大赛复赛C集训&#xff08;15&#xff09;&#xff1a;因子问题&#xff08;题目及解析&#xff09; 题目描述 任给两个正整数N、M&#xff0c;求一个最小的正整数a&#xff0c;使得a和(M-a)都是N的因子。 时间限制&#xff1a;10000 内存限制&…

Vue3进阶教程:1.初次了解vue

1.初次了解vue vue文件目录和各个文件在这里不做介绍 此课程对针对有点vue基础的同学&#xff0c;或者看过我上部分vue的教程 与之前我的Vue教程不同的是&#xff0c;写法和内容有区别 真正的了解Vue3 1.创建vue组件 1.npm create vuelatest 2.取名 3.TS要选上 4.其他先不选 5…

WordPress免费网站模板下载

大背景图免费wordpress建站模板 这个wordpress模板设计以简约和专业为主题&#xff0c;旨在为用户提供清晰、直观的浏览体验。以下是对其风格、布局和设计理念的详细介绍&#xff1a; 风格 简约现代&#xff1a;整体设计采用简约风格&#xff0c;使用了大量的白色和灰色调&am…

【深度学习新浪潮】以图搜地点是如何实现的?(含大模型方案)

1. 以图搜地点的实现方式有哪些? 扫描手机照片中的截图并识别出位置信息,主要有以下几种实现方式: 通过照片元数据获取: 原理:现代智能手机拍摄的照片通常会包含Exif(Exchangeable Image File)元数据。Exif中除了有像素信息之外,还包含了光圈、快门、白平衡、ISO、焦距…

element的el-table翻页选中功能

el-table翻页选中功能 row-key"enterpriseWorkerId" selection-change"handleSelectionChange"<el-table-column type"selection" :reserve-selection"true" width"55"></el-table-column>stuMultipleList: []…

Python打卡训练营学习记录Day38

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import torch.opt…

deepseek开源资料汇总

参考&#xff1a;DeepSeek“开源周”收官&#xff0c;连续五天到底都发布了什么? 目录 一、首日开源-FlashMLA 二、Day2 DeepEP 三、Day3 DeepGEMM 四、Day4 DualPipe & EPLB 五、Day5 3FS & Smallpond 总结 一、首日开源-FlashMLA 多头部潜在注意力机制&#x…

Linux编辑器——vim的使用

vim是一款多模式的编辑器。 基本操作&#xff1a;vim打开默认是命令模式&#xff0c;也就是输入命令然后系统执行指令&#xff0c;想要写代码&#xff0c;只需输入字母i&#xff0c;就进入插入模式&#xff0c;写完代码想要退出&#xff0c;按一下Esc&#xff0c;退回到命令模…

线性回归原理推导与应用(八):逻辑回归二分类乳腺癌数据分类

乳腺癌数据是sklearn中自带的数据集&#xff0c;需要通过相关特征对是否患有乳腺癌进行分类。 数据清洗与建模 首先加载相关库和相关数据 from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression import numpy as np import…

Jenkins分配对应项目权限与用户管理

在日常开发过程中经常会出现用户和权限管理问题&#xff0c;没有配置trigger时&#xff0c;通常需要我们手动构建&#xff0c;但此时前端和后端的朋友没有build权限&#xff0c;导致每次dev环境测试都需要麻烦我们手动去构建&#xff0c;消息传达不及时则会降低开发效率。 现有…

Mate桌面环境系统与终端模拟器参数配置

说明&#xff1a;   MATE桌面环境在使用中会优化一些参数配置&#xff0c;例如&#xff1a;电源选项、屏幕配置、字体配置、终端模拟器&#xff08;Mate Terminal&#xff09;配置等等。   通常工程师会根据自己喜好调整一些参数&#xff0c;修改后参数的保存位置在/home/u…

fabric 是一个开源框架,用于使用 AI 增强人类能力。它提供了一个模块化框架,用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题

​一、软件介绍 文末提供程序和源码下载 fabric 是一个开源框架&#xff0c;用于使用 AI 增强人类能力。它提供了一个模块化框架&#xff0c;用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题。 二、What and why 什么和为什么 自 2023 年初和 GenAI 以来&…

基于PDF流式渲染的Word文档在线预览技术

一、背景介绍 在系统开发中&#xff0c;实现在线文档预览与编辑功能是许多项目的核心需求&#xff0c;但在实际的开发过程中&#xff0c;我们经常会面临以下难点&#xff1a; 1&#xff09;格式兼容性问题&#xff1a;浏览器原生不支持解析Word二进制格式&#xff0c;直接渲染会…

数据仓库基础知识总结

1、什么是数据仓库&#xff1f; 权威定义&#xff1a;数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。 1&#xff09;数据仓库是用于支持决策、面向分析型数据处理&#xff1b; 2&#xff09;对多个异构的数据源有效集…

vue2使用element中多选组件el-checkbox-group,数据与UI更新不同步

问题描述 使用element多选checkbox组件&#xff0c;点击勾选取消勾选&#xff0c;视图未变化&#xff0c;再次点击表单其他元素&#xff0c;多选组件勾选状态发生变化&#xff0c;视图和数据未同步 第一次尝试&#xff1a;再el-checkbox-group多选父组件上增加点击事件&…

linux磁盘分区及挂载、fdisk命令详解

文章目录 1.Linux磁盘分区概念精要‌1.1 分区的定义‌1.2 多分区的必要性‌1.2.1 数据安全隔离‌1.2.2 提升存储效率‌1.2.3 防止系统资源耗尽‌1.2.4 fdisk用法介绍 2.服务器挂载磁盘实战详细步骤2.1检查磁盘情况及格式化2.2磁盘分区2.3 磁盘目录挂载2.3.1 创建挂载目录2.3.2 …

Eigen矩阵存储顺序以及转换

一、Eigen矩阵存储顺序 在矩阵运算和线性代数中,"行优先"(Row-major)和"列优先"(Column-major)是两种不同的存储方式,它们决定了多维数组(如矩阵)在内存中的布局顺序。 1. 行优先(Row-major) 定义:矩阵按行顺序存储在内存中,即第一行的所有元…