今日遇到了一个问题,要去获取HTTP报文在请求和响应的时间,因为没有原生的API可以调用,所以需要一定的技巧~
<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请求报文中是否在这个请求时间,如果有的其实可以把它通过一定手段获取到
因为【HttpServletRequest】和【HttpServletResponse】给我们提供了许多原生API,所以我们可以去找找看有哪些API是我们可以用得上的,这里推荐直接进官网 ——> 链接
再找了很久还是一无所获,干脆就想着自己去手动获取一下这个时间
SimpleDateFormat()
,于是便立马写下了这几句代码SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEEE");//格式化日期
Date currentTime = new Date();//获取当前时间
String date = formatter.format(currentTime).toString();
但是要怎么使用这个当前时间呢?去获取哪段时间呢?
doPost()
的时候,我们记录下当前的时间,就可以将其近似于HTTP的请求时间请求时间有了,那响应时间呢?也用这个去求吗?
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);
}
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("
");
stringBuilder.append("请求方法 = " + req.getMethod()); //请求方法
stringBuilder.append("
");
stringBuilder.append("请求时间 = " + date); //请求时间
stringBuilder.append("
");
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("
");
stringBuilder.append("响应状态码 = " + resp.getStatus());
stringBuilder.append("
");
resp.getWriter().write(stringBuilder.toString());
}
}
稍微来讲一下后端的这块逻辑
append()
方法去进行连接,这里我测试了Reques和Response两个类中的方法,打印出了HTTP报文的一些内容stringBuilder.append("
");
就会被当做换行了,若是不写这个的话所有的内容都会挤在一起的 resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(stringBuilder.toString());
2023年5月22日记