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

3 篇文章 0 订阅
订阅专栏

在这里插入图片描述

一、问题描述

今日遇到了一个问题,要去获取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日记

在这里插入图片描述

JAVA服务端访问量与响应时间统计工具 与 过载保护工具
10-16
这个代码如果你懂的话,说穿了也不是什么多高的东西。 但是如果你不懂的话,我可以说很多程序员工资都超2w了,他也不知道怎么弄这个,甚至不知道居然还要用到这个。 所以本资源要价很高。来自真实源码。 一个服务器端程序的运行,少不了两个必须的工具。 一、访问量与响应时间统计工具。 1、能让你知道当前服务上的接口单位时间内访问量是多少,总的响应时间是多少 2、通过1里的数据,你能知道哪个接口反应慢,如果服务假死,能根据它来快速判断哪些接口搞死了服务(实际情况中80%可以依此判断)。 二、过载保护 如果我现在的服务里接口1只能 支撑每1秒100次请求,那么如果1秒在100次以上的请求(如110次),那多出的10次就要主动拒绝服务。不然服务就会支持不住。本工具就是为这个而做。 1、单机内存版用来防止自己挂掉 2、内存版基于redis计数,可以用来控制用户的访问频率 实际应用中,只要加一个filter即可实现。见com.qq.common.util.visit.limit.StatFilter
(HttpServletRequest获得请求参数
12-11
获取http请求的参数转换成Map集合
基于HTTP GET方式获取网络时间的实现
最新发布
主要分享硬件、嵌入式软件部分知识
05-15 1181
本篇博客介绍了如何在Linux下使用C语言和Socket API发起HTTP GET请求。这个示例程序可以扩展到其他类型的HTTP请求和不同的API服务。如果不想用苏宁的服务器,可以随便请求一个网站和不存在的网页,如果网站用的是nginx的话,访问不存在的网页也会返回一个nginx时间
servlet小练习:获取用户上一次访问的时间
qinsangdilvzhi的博客
08-20 669
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //防止乱码 response.setContentType("text/html;charset=UTF-8"); PrintWriter...
Fegin-配置请求时间响应时间
失忆๑的博客
09-03 575
一)演示超时异常 请求此url的时候让其睡眠6秒 @Override public List<Product> findAllProduct() { try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); }...
获取请求响应时间、数学计算相关的工具类库、异步返回
点点的博客
11-29 631
一、后台打印请求响应时间等数据 1.1、使用shiro实现 import lombok.extern.slf4j.Slf4j; import org.apache.shiro.web.servlet.AdviceFilter; import org.springframework.core.NamedThreadLocal; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.se
java 计算接口的请求的时间
测试开发小白变怪兽
11-15 1662
思路都是将date转成long类型进行减操作 方法一: LocalDateTime beginTime = LocalDateTime.now(); Long timeConsuming = Duration.between(between,LocalDateTime.now()).toMillis(); 方法二: Long beginTime = new Date().getTime(); Long totalConsumedTime=new Date().getTime()-beginTime; ———
3-5Tomcat响应请求源码与nio处理请求源码实现.mp4
12-07
3-5Tomcat响应请求源码与nio处理请求源码实现.mp4
tcprstat 网络时延与响应时间测试神器!
05-26
tc:时延超过40ms的包个数,可以通过-T参数指定这个时间 95_max:按照时延从小到达排序,第95%的时延值,例如1000个请求,把他们的时延值排序,第%95的时延也就是第950个数组成员的时延值 95_avg: 按照时延从小到达...
一个用socket来实现HTTP下载的程序源码.rar_CHttpSocket_http 下载_http下载_http请求响应_
09-22
本文带源代码还包括了一个使用CHttpSocket实现下载功能的...注意,所有的调用都是阻塞的,所以最好为一个下载任务创建一个线程,否则会导致界面无法响应用户输入. 程序运行界面如上图,显示了请求头,回应头以及下载进度.
Http请求头和响应
05-29
NULL 博文链接:https://yelb.iteye.com/blog/857586
通过http请求得到服务器时间
10-22
通过http请求得到服务器时间 输入网址得到这个网站服务器的时间
HTTP请求头概述(HttpServletRequest)
01-18
HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。  下面是一些最常见的请求头 ......
详解Vue.js 响应接口
11-20
Vue 可以添加数据动态响应接口。 例如以下实例,我们通过使用 $watch 属性来实现数据的监听,$watch 必须添加在 Vue 实例之外才能实现正确的响应。 实例中通过点击按钮计数器会加 1。setTimeout 设置 10 秒后计算器的值加上 20 。 <div xss=removed> <p xss=removed>计数器: {{ counter }}</p> <button @click = "counter++" style = "font-size:25px;">点我</button> </div> <script type = "text/
使用拦截器记录每个请求的 url 和执行所需的时间
临窗,听雨声
06-12 2678
1.实现 HandlerInterceptor 接口 因为要记录执行时间,所以这里使用 ThreadLocal import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http....
http 请求时间(转)
lqn2011的专栏
11-17 638
在以前做一个android的移动项目的时候,想为httpClient对象添加请求超时和读取超时时间,发现httpClient的对象实现的 defaultHttpClient对象中就没有设置超时时间的方法,所以一直郁闷的,觉得怎么回没有,难道defaultHttpClient对象中已 经封装了请求超时时间和读取时间,不过这样不是可扩张性不好了,最近在android论坛上面,发现了其实androi...
Servlet生命周期及请求、响应
sssxlxwbwz的博客
03-17 751
一、Servlet生命周期 Servlet运行在Servlet容器中,其生命周期由容器全盘控制。容器会创建请求和响应对象、为Servlet分配一个线程、调用servlet的service()方法,并传递请求和响应对象的引用作为参数。 当应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件,这些事件叫做Servlet的生命周期事件(或方法)。Servlet 生命周期可以归纳为:Servlet 加载--->实例化--->服务--->销毁...
前端获取服务端时间
weixin_34344677的博客
11-23 1200
前端得到的本地时间(设备时间)不一定是准确的,因为用户有可能故意修改时间,用这个不一定准确的时间做一些校验往往不靠谱。 一般获取服务端时间,都是通过接口让后端返回的,其实,也有方法在前端直接获取服务端的时间。 var req = new XMLHttpRequest(); req.open('GET', location, false);...
Javaweb学习笔记之HttpServletRequest(一):获取客户端发送给服务器的数据
秋忆夏伤的博客
05-07 1662
package com.demo.b_request; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.annotation...
linux多线程http请求folk接收 源码
01-01
linux 多线程http请求folk接收的源码通常是由C或C++语言编写而成。该源码通常包括了使用多线程技术来实现http请求的并发处理。在源码中,会涉及到线程的创建、管理和同步,以及http请求的解析和处理等方面的实现。 在源码中,可能会使用类似于pthread_create()等函数来创建线程,并使用类似于pthread_join()等函数来管理线程的执行顺序和同步。同时,源码中可能会包括http请求的解析和处理逻辑,包括从套接字中读取请求消息、解析请求头和参数、处理请求并生成响应消息等步骤。 另外,由于http请求的并发处理需要考虑到线程安全和性能等问题,因此在源码中可能会涉及到如何进行线程间的数据共享和互斥访问、如何使用线程池来管理线程的数量和复用等技术。 总的来说,linux多线程http请求folk接收的源码涉及到了多线程并发处理和http请求处理等方面的复杂逻辑和技术实现,需要对操作系统、网络编程和多线程编程等方面具有一定的深入理解和实践经验才能完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • MySQL | JDBC连接数据库详细教程【全程干货】 18119
  • 猿创征文|我的C/C++技术成长之路 12477
  • 思科模拟器 | 生成树协议STP、RSTP、HSRP配置 10325
  • Linux | 人生苦短,我用Vim【最受欢迎的编辑器】 10172
  • 【好一朵美丽的玫瑰花】(C++代码实现+EasyX图形化界面) 10062

分类专栏

  • C生万物 28篇
  • C++ 20篇
  • Linux
  • Linux系统编程 6篇
  • Linux基础入门篇 12篇
  • 数据库
  • SQL Server 3篇
  • MySQL 4篇
  • 算法 11篇
  • 双指针 8篇
  • 滑动窗口 4篇
  • 动态规划 2篇
  • 九阳神功
  • 数据结构 22篇
  • 计算机网络 3篇
  • Java
  • Java基础 10篇
  • JavaWeb 3篇
  • Spring 1篇
  • Spring Boot 5篇
  • Maven 1篇
  • 异常排查 7篇
  • STL 5篇
  • LeetCode算法笔记 29篇
  • 牛客算法笔记 2篇
  • 开发工具 2篇
  • 面试 6篇
  • 我的程序人生 7篇
  • Git 2篇
  • 思科模拟器 3篇
  • 计算机视觉 1篇
  • 活动文章 2篇
  • 云计算 1篇

最新评论

  • SpringBoot解决前后端分离跨域问题:状态码403拒绝访问

    YoruXD: 博主太帅了,关注一波

  • SpringBoot解决前后端分离跨域问题:状态码403拒绝访问

    烽起黎明: 对您有帮助就行表情包

  • Linux | 人生苦短,我用Vim【最受欢迎的编辑器】

    烽起黎明: Vim在Linux等其他平台下做开发还是蛮常用,可以学习了解一下~

  • C/C++内存管理详解

    烽起黎明: 哈哈,C/C++的内存管理是比较难的,毕竟贴近底层了。结合书本慢慢琢磨一下

  • Linux | 人生苦短,我用Vim【最受欢迎的编辑器】

    豹子头-零充!: 我不知道这种编辑器,为啥还要用,偶尔用用就行了,日常开发还用,那效率不太低了?

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 【年终总结】回首2023的精彩,迈向2024的未来
  • Spring Boot日志:从Logger到@Slf4j的探秘
  • SpringBoot解决前后端分离跨域问题:状态码403拒绝访问
2024年2篇
2023年108篇
2022年66篇

目录

目录

评论 101
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烽起黎明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司荷坳SEO按天计费坪地网站搭建坪地网站优化按天扣费大浪seo网站推广观澜百度竞价包年推广布吉网站改版沙井网站seo优化西乡外贸网站建设光明网站制作设计福永网站搜索优化丹竹头seo网站优化坂田百度竞价松岗网站开发横岗外贸网站制作大浪至尊标王石岩百姓网标王吉祥网站优化福田网站优化按天收费石岩网站优化按天计费松岗关键词按天收费横岗网站改版龙岗企业网站制作龙华网站设计大芬网站优化软件福永网站优化按天收费坪地SEO按天计费龙华百度竞价包年推广丹竹头网站seo优化荷坳网站排名优化永湖网站改版歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化