Spring MVC拦截器3:拦截器案例:开发【获取“用户流量信息”的拦截器】;(logback日志组件:把日志存储到日志文件中;)

说明: 

(1)本篇博客合理性解释:

          ● 在【Spring MVC拦截器1:拦截器入门一】和【Spring MVC拦截器2:拦截器入门二】两篇博客介绍了拦截器的基本使用;那么,本篇博客就通过一个案例,演示下在项目中如何使用拦截器;

          ● 文章逻辑:当用户发送请求,访问我们的系统时 → 请求中包含很多信息 → 我们可以收集这些基础信息,以供利用 → 为此,拦截器就派上用场了 → 我们可以利用拦截器拦截用户请求,从而获取请求中的基础信息 → 然后,我们也可以把这些信息存储到具体日志文件中 → 为此,就引出了利用logback存储日志了;

(2)本篇博客的代码沿用自 【Spring MVC拦截器2:拦截器入门二】的【interceptor工程】;

(3)本篇博客内容:

          ● 使用拦截器来采集用户基础数据;

          ● 也涉及到了【使用logback日志组件,把日志数据存储到日志文件中】

目录

一: 用户流量信息简述;

二:预先准备:先创建一个【拦截用户请求,以获取流量信息】的拦截器类:AccessHistoryInterceptor类; 

1.创建拦截器类:AccessHistoryInterceptor类;

三:引入logback日志组件; 

1.在pom.xml中引入logback依赖;

2.创建并编写logback.xml配置文件:【定义输出器】;【把输出器作用到AccessHistoryInterceptor这个类上】;

(1)创建logback.xml文件,并通过基本配置,看下是否OK;

(2)在logback.xml配置,把日志信息存储到本地日志文件中;(核心重点!!!)

四: AccessHistoryInterceptor拦截器类:【获取用户请求信息】,【将这些信息,存储到日志中去】;(核心重点!!!)

五:在applicationContext.xml中,配置AccessHistoryInterceptor这个拦截器;

六:最后,启动Tomcat,测试;


一: 用户流量信息简述;

(1)用户流量信息:用户在访问我们的系统时,用户请求中包含如访问时间、访问网址(url)、使用的什么浏览器、使用的什么系统、使用的什么手机、用户IP等信息;

(2)这些用户流量信息是比较重要的:比如电商网站:● 我们根据访问网址(url),就能看出什么商品是最受欢迎的;● 根据访问时间,就能推断出用户是夜猫子还是白天访问;(由此,针对不同的时间段,我们是否可以推荐不同的商品);● 根据发送的请求中附带的用户环境信息,知道当前用户是使用PC机访问的还是使用手机访问的;用到手机是iOS还是Android;

(3)在用户访问应用时,这些用户流量信息,我们可以通过拦截器来收集;

(4)即,本篇博客主要内容是:如何使用拦截器来采集用户基础数据;同时,在其中也会介绍如何使用logback日志组件来存储日志数据;


二:预先准备:先创建一个【拦截用户请求,以获取流量信息】的拦截器类:AccessHistoryInterceptor类; 

1.创建拦截器类:AccessHistoryInterceptor类;

初始准备,我们创建AccessHistoryInterceptor拦截器类,来完成采集用户基础数据的工作;

AccessHistoryInterceptor:

package com.imooc.restful.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 访问历史拦截器;所有的请求都会被这个拦截器拦截,在请求被处理之前,把请求的相关信息记录到日志文件中;
 */
public class AccessHistoryInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
}

说明:

(1)因为AccessHistoryInterceptor拦截器类的主要目的是:拦截用户请求,获取其中的基础信息;所以,这个方法只实现类preHandle()方法;


三:引入logback日志组件; 

前面介绍过logback日志组件:如有需要可以依次参考;

         ●【MyBatis进阶一:slf4j日志门面和logback日志组件;(在MyBatis中的使用logback)(本篇博客仅仅是在控制台输出日志信息,不涉及把日志信息存储到日志文件)】:第一次引入SLF4日志门面、logback日志实现;(也知道了Mybatis框架中,可以很好的使用logback日志组件)

         ●【【logger.error()】介绍;(只是将日志打印在Console控制台)】:介绍了logger.error()方法的几种重构形式;

         ●【Spring JDBC与事务管理5:Spring编程式事务;】:知道引入logback后,Spring框架就可以默认使用logback来输出日志;

1.在pom.xml中引入logback依赖;

然后,一个老生常谈的点:引入一个新依赖后,如有需要,记得把这个依赖添加到发布中去;

我们知道,引入logback依赖后,Spring框架就可以默认使用logback来输出日志;启动Tomcat,看下logback是否生效了;

2.创建并编写logback.xml配置文件:【定义<appender>输出器】;【把输出器作用到AccessHistoryInterceptor这个类上】;

(1)创建logback.xml文件,并通过基本配置,看下是否OK;

在logback配置文件logback.xml中,自定义日志的格式;

logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="consoleheihei" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%thread] %d %level %logger{10} -%msg%n</pattern>
<!--            <pattern>%d{HH:mm:ss:SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="consoleheihei"></appender-ref>
    </root>
</configuration>

说明:这些配置项的解释, 【MyBatis进阶一:slf4j日志门面和logback日志组件;(在MyBatis中的使用logback)(本篇博客仅仅是在控制台输出日志信息,不涉及把日志信息存储到日志文件)】中有详细介绍,这儿就不重复了;

……………………………………………………

(2)在logback.xml配置,把日志信息存储到本地日志文件中;(核心重点!!!)

日志打印在控制台中并不符合我们的需求,我们想要的是:AccessHistoryInterceptor这个类获取用户请求数据,然后再把这些数据转移到日志中去;然后,将这些日志信息存储在系统的某个日志文件中;只有把日志保存在一个日志文件中,才有助于我们后面分析嘛;

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="consoleheihei" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%thread] %d %level %logger{10} -%msg%n</pattern>
<!--            <pattern>%d{HH:mm:ss:SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
        </encoder>
    </appender>
    <appender name="accessHistoryLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>e:/logs/history.%d.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>[%thread] %d %level %logger{10} -%msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="consoleheihei"></appender-ref>
    </root>
    <logger name="com.imooc.restful.interceptor.AccessHistoryInterceptor"
            level="INFO" additivity="false">
        <appender-ref ref="accessHistoryLog"/>
    </logger>
</configuration>

说明:

(0)在  【MyBatis进阶一:slf4j日志门面和logback日志组件;(在MyBatis中的使用logback)(本篇博客仅仅是在控制台输出日志信息,不涉及把日志信息存储到日志文件)】中,我们第一次遇到了logback.xml的<appender>输出器配置,如有需要可以参考;

(1)为了实现【使用logback,完成把AccessHistoryInterceptor这个类产生的日志,存储到某个日志文件中】;需要在logback.xml配置文件中,配置一个新的<appender>输出器,同时通过<logger>使其作用到AccessHistoryInterceptor这个类上;

(2)配置内容分析;

至此,为了实现【使用logback,完成把AccessHistoryInterceptor这个类产生的日志,存储到某个日志文件中】这个目标;logback的底层日志配置就完成了;接下来就是,结合logback日志,利用拦截器拦截用户数据,并写入日志了;


四: AccessHistoryInterceptor拦截器类:【获取用户请求信息】,【将这些信息,存储到日志中去】;(核心重点!!!)

在AccessHistoryInterceptor拦截器类中,编写代码:拦截用户请求,获取请求中的信息,将这些信息添加到日志中去;

package com.imooc.restful.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 访问历史拦截器;所有的请求都会被这个拦截器拦截,在请求被处理之前,把请求的相关信息记录到日志文件中;
 */
public class AccessHistoryInterceptor implements HandlerInterceptor {
    private Logger logger = LoggerFactory.getLogger(AccessHistoryInterceptor.class);

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        StringBuilder log = new StringBuilder();
        log.append(request.getRemoteAddr());//获取请求的ip地址,并追加到log字符串上;
        log.append("|");
        log.append(request.getRequestURL());//获取请求的url地址,并追加到log字符串上;
        log.append("|");
        log.append(request.getHeader("user-agent"));//获取请求中的“user-agent”请求头,并追加到log字符串上;“user-agent”请求头是用户的客户端环境;
        //这儿我们只获取了【用户ip】,【请求url】,【user-agent请求头】;这儿只是一个演示;以后在实际开发中,根据具体业务需求,增加即可;
        logger.info(log.toString());//对日志进行输入
        return true;
    }
}

说明:

(1)Logger和LoggerFactory,是哪个包下的,别用错了:要用slf4j这个日志门面中的;(自然我们引入的logback提供了slf4j的具体实现)

(2)因为日志这儿,涉及大量的字符串操作,由于String具有不可变性,为了减轻内存和垃圾回收的压力,这儿使用了StringBuilder;

(3)这儿只是举了几个例子,在用户请求中,获取用户的一些基础信息; 

其中的user-agent请求头,如果记不清了,可以参考下图;

(4)因为我们在logback.xml中配置的日志最低级别是“INFO”,所以这儿我们使用Logger对象的info()方法来输出日志信息;

(5)因为我们已经在logback.xml中配置了AccessHistoryInterceptor类和对应的<appender>输出器;所以,此时AccessHistoryInterceptor类产生的日志信息,就可以存储到对应的日志文件;

拦截器类编写好了之后,但Spring MVC还不认识这个类,为此我们需要在applicationContext.xml中对其进行配置;


五:在applicationContext.xml中,配置AccessHistoryInterceptor这个拦截器;

在applicationContext.xml中配置AccessHistoryInterceptor这个拦截器;


六:最后,启动Tomcat,测试;

日志信息为:(因为AccessHistoryInterceptor拦截器,只拦截了resources目录下的静态资源,而我们的resources目录仅仅是个演示用的,没什么是实质作用,所以对弈js,ico等静态资源的也拦截到了)

[http-nio-80-exec-1] 2021-11-30 20:04:43,880 INFO c.i.r.i.AccessHistoryInterceptor -0:0:0:0:0:0:0:1|http://localhost/client.html|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36
[http-nio-80-exec-2] 2021-11-30 20:04:43,924 INFO c.i.r.i.AccessHistoryInterceptor -0:0:0:0:0:0:0:1|http://localhost/jquery-3.5.1.js|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36
[http-nio-80-exec-5] 2021-11-30 20:04:54,372 INFO c.i.r.i.AccessHistoryInterceptor -0:0:0:0:0:0:0:1|http://localhost/favicon.ico|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36
[http-nio-80-exec-3] 2021-11-30 20:08:55,761 INFO c.i.r.i.AccessHistoryInterceptor -0:0:0:0:0:0:0:1|http://localhost/restful/persons|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36

在实际的业务中,这些请求中的基础信息,目前看似无用;其实,其中蕴含着很多有用的商机等信息;

以前自己做项目的时候,也做过这样的业务:从日志信息中提取出特定的信息,以分析数据,获取更有效的信息;


注:以后遇到一些,需要【对url进行批量处理的】场景,那么很可能就能用上拦截器;

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值