本学期开设了JavaWeb课程,学习内容主要为servlet等(虽然很老,but...),在这里分享下本课程的实验,记录一下。
本次主要分享使用使用过滤器和监听器打印日志,显示在控制台上。
具体内容如下:
(1)使用过滤器打印日志:打印请求路径(请求消息的第一部分:请求行)和响应结果(响应消息的第一部分:状态行)
(2)使用监听器打印日志:打印请求路径(请求消息的第一部分:请求行)
首先你要了解http的请求组成,响应组成。知道请求消息的请求行、响应消息的状态行里面都包括什么东西。
参考blog:HTTP 结构详解-优快云博客
1.使用过滤器打印日志
打印请求路径(请求消息的第一部分:请求行)和响应结果(响应消息的第一部分:状态行)
JavaWeb三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
Filter 过滤器的知识,参考blog:Filter过滤器(超详细)_filter dofilter-优快云博客
这里重点理解filter过滤器的工作流程:
filter拦截http请求(通过@WebFilter注解配置拦截路径),可以在创建的同一个filter过滤器中对响应内容进行拦截(通过图片可明白,响应回来的内容还会经过过滤器的拦截)。
@WebFilter(filterName = "AdminFilter", urlPatterns = "/*")
后端实现代码
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
System.out.println("Filter 过滤器拦截到的请求消息的请求行信息: " + request.getMethod()+" "+request.getRequestURI()+ " " + request.getProtocol());
User u = (User) request.getSession().getAttribute("user");
if (u == null || u.isIsadmin() == false) {
response.sendRedirect("../index.jsp");
} else {
// pass the request along the filter chain
chain.doFilter(req, resp);
int statusCode= response.getStatus();
System.out.println("Filter 过滤器拦截到的响应结果的状态行消息: " + request.getProtocol()+" "+statusCode+ " " + getReasonPhrase(statusCode));
}
}
其中请求消息的请求行是通过下列代码获取请求方法、请求URL(不包括域名)、HTTP协议版本
HttpServletRequest request = (HttpServletRequest) req;
request.getMethod()
request.getRequestURI()
request.getProtocol()
响应消息的状态行通过下列代码获取响应消息对应的协议版本、状态码与原因短语
这里需要注意response不能直接获取协议版本,是需要通过request获取,实现代码为:
HttpServletResponse response = (HttpServletResponse) resp;
int statusCode= response.getStatus();//获取响应消息的状态码
request.getProtocol() //协议版本
getReasonPhrase(statusCode)); //原因短语
其中原因短语是通过状态码判断的,实现代码为
private String getReasonPhrase(int statusCode) {
switch (statusCode) {
case 200:
return "OK";
case 302:
return "Move Temporarily";
case 404:
return "Not Found";
case 500:
return "Internal Server Error";
default:
return "Not known";
}
}
2.使用监听器打印日志
这里要对Listener(监听器)的作用和内部机制进行学习,参考博客:Listener(监听器)的简单介绍_listener各类介绍-优快云博客
此处我们通过监听ServletRequest
域对象的创建与销毁,因为访问服务器任何资源都会发送请求(ServletRequest)出现,访问.html和.jsp和.servlet都会创建请求,打印日志信息。
实现代码为:
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
System.out.println("Listener监听器拦截到的请求消息的请求行信息: " + request.getMethod()+" "+request.getRequestURI()+ " " + request.getProtocol());
}
其中请求消息的请求行内容获取同上。
ps.打印日志信息也可以通过log4j 输出日志。
参考博文:Log4j的配置与使用详解_运行streaming监听log4j日志信息,如果只想接收警告级别及以上信息,lgg4j应该-优快云博客
如有问题,欢迎评论区交流讨论。