如何获取HTTP请求时间与响应时间【附源码】

news2024/11/25 2:28:26

在这里插入图片描述

文章目录

  • 一、问题描述
  • 二、抓包观察
  • 三、查找文档
  • 四、思考尝试
  • 五、精益求精
  • 六、源码解说

一、问题描述

今日遇到了一个问题,要去获取HTTP报文在请求响应的时间,因为没有原生的API可以调用,所以需要一定的技巧~

  • 下面主体的框架和代码,我使用了form表单去构造一个POST请求,然后在Servlet中重写doPost()方法,然后实现获取请求时间和响应时间的代码逻辑
<form action="print" method="post">
    <input type="submit" value="打印信息">
</form>
@WebServlet("/print")
public class printServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//...
    }
}

二、抓包观察

我们可以先去观察一下在发起POST请求后这个HTTP请求报文中是否在这个请求时间,如果有的其实可以把它通过一定手段获取到

  • 但遗憾的是,我并没有发现任何与时间相关的东西😥

在这里插入图片描述

  • 那再到请求报文中去看看的话,就发现了与时间相关的内容,不过对照现在的时间仔细一看的话,却查了不少,网上一搜就发现GMT是格林尼治时间,要比现在的时候早上8个小时,但看到一个时间却非常激动,想着如何拿到它

在这里插入图片描述

三、查找文档

因为【HttpServletRequest】和【HttpServletResponse】给我们提供了许多原生API,所以我们可以去找找看有哪些API是我们可以用得上的,这里推荐直接进官网 ——> 链接

在这里插入图片描述

  • 可以看到,无论是前者还是后者都未我们提供了很多的方法,这也我也会在代码中使用几个,不过找了一圈我发现完全没有获取时间的那种API,于是就没有再查找下去了

在这里插入图片描述

四、思考尝试

再找了很久还是一无所获,干脆就想着自己去手动获取一下这个时间

  • 此时我就想到了Java里面的Date类,可以获取当前系统的时间,以及随之对应的是格式化解析SimpleDateFormat(),于是便立马写下了这几句代码
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEEE");//格式化日期
Date currentTime = new Date();//获取当前时间
String date = formatter.format(currentTime).toString();

💬 但是要怎么使用这个当前时间呢?去获取哪段时间呢?

  • 首先我就提出了上面这个问题,思考了一下从Tomcat解析HTTP请求到将其交给Servlet做处理,那么能够最早获取到时间的地方就是一开始进入doPost()的时候,我们记录下当前的时间,就可以将其近似于HTTP的请求时间

💬 请求时间有了,那响应时间呢?也用这个去求吗?

  • 这个的话不一定,因为刚才我们看了HTTP的响应报文,也就是服务端在处理完数据后给浏览器返回的一个响应,里面是存在【Date】这个时间的,你可以选择使用getHeaderNames()先获取到整个报文的头部,因为他的返回值是一个Collection集合,所以你可以通过遍历集合的方式与getHeader()相配合格式化地输出里面的内容,这里我就不细说了
  • 也是一样,我们可以通过上面这种方式去获取响应时间,何时获取才是最正确的呢?那就是在resp.getWriter().write()这个发还响应之前去获取时间,这是最后的机会了!

五、精益求精

通过返回我们在后端代码中获取到的时间,将其返还给浏览器时便看到这个【请求时间】和【响应时间】是一样的,这是为什么呢?

在这里插入图片描述

  • 仔细观察我设置的日期格式化,是精确到秒的,如果你有一点计算机常识的话就可以知道计算机的运行速度是很快的,基本是以纳秒为单位,此时我们若是只精确到秒 的话可能还看不太出来,应该再多精确几位
yyyy-MM-dd HH:mm:ss
  • 可以看到,此时我精确到了纳秒的级别,此时再去观察的话就会有所不同
yyyy-MM-dd HH:mm:ss.SSSSSSSSS
  • 可以看到虽然精确了很多位数,但是二者之间的差距还是很小,毕竟计算机的处理速度也是非常快的

在这里插入图片描述

但是这么去做的只是钻了一个牛角尖🐂,后面我又想到了一个更聪明的办法

  • 那就是让程序等待一段时间!
try {
    Thread.sleep(500);      //让程序暂停0.5s
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}
  • 学习过Java多线程的同学一定马上就能反应过来了,可以使用Thread类中的sleep()方法让程序睡上几秒,然后再去获取时间。此时我们再去观察【请求时间】和【响应时间】的话就会有些差距了。如果你想让差距更加明显的话可以让程序多睡一会

在这里插入图片描述

六、源码解说

这里的话附上我们解决本体所用的源码

前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表单</title>
</head>
<body>
    <form action="print" method="post">
        <input type="submit" value="打印信息">
    </form>
</body>
</html>

后端:

@WebServlet("/print")
public class printServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        // 在doPost()方法开始时获取一下请求时间
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS");//格式化日期
        Date currentTime=new Date();//获取当前时间
        String date=formatter.format(currentTime).toString();

        StringBuilder stringBuilder = new StringBuilder();

        System.out.println("-------------------------------------------------");
        stringBuilder.append("请求的URL = " +  req.getRequestURL());   //请求的URL
        stringBuilder.append("<br>");
        stringBuilder.append("请求方法 = " + req.getMethod());        //请求方法
        stringBuilder.append("<br>");
        stringBuilder.append("请求时间 = " + date);                                  //请求时间
        stringBuilder.append("<br><br>");

        try {
            Thread.sleep(500);      //让程序暂停0.5s
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        // 在doPost()方法快结束时获取一下响应时间
        currentTime = new Date();//获取当前时间
        String date2 = formatter.format(currentTime).toString();
        stringBuilder.append("响应时间 = " + date2);
        stringBuilder.append("<br>");

        stringBuilder.append("响应状态码 = " + resp.getStatus());
        stringBuilder.append("<br>");

        resp.getWriter().write(stringBuilder.toString());
    }
}

💬 稍微来讲一下后端的这块逻辑

  • 这边我主要使用到的就是这个【StringBuilder】类,使用它构造出来的对象,我们需要在单线程的环境下连接多个字符串,此时用它最合适了,通过里面的append()方法去进行连接,这里我测试了Reques和Response两个类中的方法,打印出了HTTP报文的一些内容
  • 还要注意,有些同学在看我这句代码的时候很疑惑,所我怎么把前端的代码写到后端来了
stringBuilder.append("<br>");
  • 这里主要就是依赖于前面的这句代码,我将当前body中的数据格式设置为了HTML,代表可以识别HTML代码,所以这个<br>就会被当做换行了,若是不写这个的话所有的内容都会挤在一起的
 resp.setContentType("text/html;charset=utf-8");
  • 最后的这句话就是将拼接的StringBuilder类型字符串转换为String类型并发还给浏览器一个响应,将拼接的内容都打印展示出来
resp.getWriter().write(stringBuilder.toString());

2023年5月22日记

在这里插入图片描述

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

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

相关文章

如何在 Linux 服务器上更改分区方案?

在 Linux 服务器上&#xff0c;分区方案对于数据存储和系统管理至关重要。当服务器的存储需求发生变化或者需要重新组织分区时&#xff0c;更改分区方案是一个常见的任务。 本文将详细介绍如何在 Linux 服务器上更改分区方案。 步骤一&#xff1a;备份数据 在更改分区方案之前…

Microsoft Office 2013安装

哈喽&#xff0c;大家好。今天一起学习的是office2013的安装&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows 7 支持Win10安装&#xff0c;不建议Win11安装&#xff0c;不支持WinXP系统 系统类型&#xff1a;64位 演示版本…

Jmeter函数助手函数--计数器详解

函数 作用 ${__counter(,)} 计数器&#xff0c;每次加1 ${__dateTimeConvert(,,,)} 时间格式转换 ${__intSum(,,)} 整数相加 ${__P(,)} 获取属性 ${__setProperty(,,)} 设置属性 ${__Random(,,)} 随机数 ${__threadNum} 线程编号 ${__time(,)} 获取当前时间戳…

Axure教程-竖向堆叠图(中继器)

本文将教大家如何用AXURE中的中继器动态竖向堆叠图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://wo8zqr.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87810606 二、功能介绍 简单填写中继器内容即可生成动态竖向堆…

Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试

Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试 文章目录 Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试什么是单元测试?单元测试结构化程序时代单元测试与使用单元测试的误解单元测试过程成本效率不高结论单元测试的优点测试用例白盒覆盖…

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下&#xff0c;对PPO做GI或GR的时候&#xff0c;出现的异常可以在COGI中间被列出&#xff1b;在这些数据进入COGI之前&#xff0c;系统会把这些数据记录在CO1P中&#xff1b;换句话说&#xff0c;系统有时会出现DB的更新延时&#xff0c;当延时发生的时候&#xf…

从零实现一个数据库(DataBase) Go语言实现版 6.持久化到磁盘

英文源地址 持久化至磁盘 前一章中的b树数据结构可以很容易地转存到磁盘上.让我们在它之上建立一个简单地kv存储. 由于我们的b树实现是不可变的, 我们将以仅追加的方式分配磁盘空间, 重用磁盘空间将推迟到下一章. 持久化数据的方式 正如前面章节所提到的, 将数据持久化到磁…

黑马程序员的基础班都是一些什么内容?

黑马推出了基础班的课程&#xff0c;各学科点击申请基础班试学 Java学科基础班 JavaSE基础基础班阶段一 课时:9天 技术点:60项 测验:1次 学习方式:线下面授 学习目标 1.掌握Java开发环境基本配置 2.掌握运算符、表达式、流程控制语句、数组等的使用 3.熟练使用IDEA开发工具…

SQL优化的思路和步骤

数据库优化 创建索引: 创建合适的索引提高查询速度 分库分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且使用时改用水平分表和垂直分表来优化 读写分离(集群): 当一台服务不能满足需要时&#xff0c;采用读写分离的方式进行集群 缓存: 使用redis来进行缓存 …

ServerBoss:国产免费的Linux连接工具,服务器管理工具

在这个数字化时代&#xff0c;Linux正在成为越来越多企业的首选操作系统。但是&#xff0c;由于它复杂的命令行界面和复杂的文件系统&#xff0c;许多用户可能会认为Linux不太友好和难以驾驭。同时目前大部分Linux连接工具都是国外产品&#xff0c;且需要商业授权。在此背景下&…

案例14:Java酒店管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

产研团队任务管理工具:盘点国内外9款知名任务管理系统软件

以下是10款国内外最知名的任务管理系统&#xff1a;1.研发项目任务管理-PingCode&#xff1b;2.通用项目任务管理-Worktile&#xff1b;3.免费开源研发任务工具-Redmine&#xff1b;4.海外著名项目任务管理工具-Asana&#xff1b;5.免费任务管理软件-Trello&#xff1b;6.个人任…

springboot防止反编译proguard+xjar

一、背景 项目组核心代码模块部署于用户服务器上&#xff0c;直接甩jar包到服务器的方式&#xff0c;极有可能导致数据泄露和代码泄露&#xff0c;为了防止有技术能力的用户反编译我们的程序&#xff0c;采用了proguard和xjar两种方式来混淆和加密jar包&#xff0c;注&#xf…

shell和ansible自动化运维实例

目录 1、找到java进程并kill 2、nohup启动jar包&#xff0c;并按日期写入log日志 3、vscode上传服务器 4、ansible-playbook的copy模块 5、ansible-playbook的cron模块 6、ansible将文件批量推送至其他服务器的指定目录 将N台电脑上的java程序定时重启&#xff0c;不用每隔…

霍尔电流传感器的注意事项及其在直流列头柜中的应用

安科瑞虞佳豪 霍尔电流传感器​注意事项 &#xff08;1&#xff09;电流传感器必须根据被测电流的额定有效值适当选用不同的规格的产品。被测电流长时间超额&#xff0c;会损坏末极功放管&#xff08;指磁补偿式&#xff09;&#xff0c;一般情况下&#xff0c;2倍的过载电流…

清华开源图文对话大模型!表情包解读有一手,奇怪的benchmark增加了

丰色 萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 什么&#xff0c;最懂表情包的中文开源大模型出现了&#xff1f;&#xff1f;&#xff01; 就在最近&#xff0c;来自清华的一个叫VisualGLM-6B的大模型在网上传开了来&#xff0c;起因是网友们发现&#xff0c;它连表情包似乎…

物联协议整理——蓝牙BLE

最近公司很多物联设备都使用BLE蓝牙和ZigBee通信&#xff0c;中间对设备功耗要求很高&#xff0c;补充下相关知识。 蓝牙协议栈 PHY层&#xff08;Physical layer物理层&#xff09;。PHY层用来指定BLE所用的无线频段&#xff0c;调制解调方式和方法等。PHY层做得好不好&#…

编译原理之词法分析实验(附完整C/C++代码与总结)

一、实验内容 通过完成词法分析程序&#xff0c;了解词法分析的过程。编制一个读单词程序&#xff0c;对PL/0语言进行词法分析&#xff0c;把输入的字符串形式的源程序分割成一个个单词符号&#xff0c;即基本保留字、标识符、常数、运算符、分界符五大类。 对PL/0语言进行词法…

关于VSCODE的插件 一

官方API文档 1. 要学好TypeScript。 官方教程 1.1TypeScript是一门弱类型语言。 强类型和弱类型主要是站在变量类型处理的角度进行分类的。这些概念未经过严格定义&#xff0c;它们并不是属于语言本身固有的属性&#xff0c;而是编译器或解释器的行为。主要用以描述编程语言…

IT知识百科:三大云计算模型IAAS、PAAS、SAAS

引言 云计算已经成为现代IT架构的核心组成部分&#xff0c;而云服务模型是构建和交付云计算服务的关键概念。在云服务模型中&#xff0c;IAAS、PAAS和SAAS是最常见的三种模型。 本文将深入介绍这三种模型&#xff0c;探讨它们的特点、优势以及在不同场景下的适用性。 IAAS&am…