过滤器Filter、监听器Listener的使用,打印日志信息在控制台上

本学期开设了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应该-优快云博客

如有问题,欢迎评论区交流讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值