掘金日新计划 · 8 月更文挑战第38天--SpringMVC拦截器(二)用户拦截器

86 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第38天,点击查看活动详情

用户拦截器开发的意义:我们开发拦截器的原因是用来记录的轨迹行为,比如用户几点访问我们的应用,都浏览哪些商品,是使用app访问还是使用pc段访问,通过这些数据,我们可以进行数据分析,对应用运营作出合理的规划,锁定用户行为,推荐用户感兴趣的商品,进行合理变现。接下来跟着我一起来创建一个拦截器,加深理解。

1.创建拦截器AccessHistoryInterceptor类文件

image.png

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());
        log.append("|");
        log.append(request.getRequestURL());
        log.append("|");
        log.append(request.getHeader("user-agent"));
        logger.info(log.toString());
        return true;
    }
}

代码说明:

  • private Logger logger = LoggerFactory.getLogger(AccessHistoryInterceptor.class);
    引入拦截器logger对象
  • StringBuilder log = new StringBuilder();:获取log对象
  • log.append(request.getRemoteAddr());:获取远程Ip地址
  • log.append(request.getRequestURL());:获取访问的url地址
  • log.append(request.getHeader("user-agent"));获取浏览器类型

2.pom.xml引入日志依赖

image.png

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

3.logback.xml配置

image.png

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

代码说明:

  • [%thread] %d %level %logger{10} - %msg%n:日志输出格式
  • ch.qos.logback.core.rolling.RollingFileAppender:以滚动的形式输出日志文件
  • fileNamePattern:用来设置日志输出保存的路径
  • com.imooc.restful.interceptor.AccessHistoryInterceptor:设置拦截记录的包地址
  • additivity="false":false记录到日志文件 true输出到控制台

4.applicationContext.xml配置拦截器

image.png

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/resources/**"/>
        <bean class="com.imooc.restful.interceptor.AccessHistoryInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

代码说明:

  • <mvc:exclude-mapping:排除的目录
  • <bean class :定义拦截器的bean类文件

5.启动应用,查看控制台输出

image.png [http-nio-8089-exec-4] 2022-08-27 10:05:03,711 INFO c.i.r.i.AccessHistoryInterceptor - 0:0:0:0:0:0:0:1|http://localhost:8089/restful/request|PostmanRuntime/7.26.8
[http-nio-8089-exec-4] 2022-08-27 10:05:03,766 DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'text/html;charset=utf-8', given [/] and supported [text/html;charset=utf-8, application/json;charset=utf-8, text/plain, /, application/json, application/*+json]
[http-nio-8089-exec-4] 2022-08-27 10:05:03,766 DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing ["{"message":"返回查询结果"}"]