首页 > 其他分享 >Spring MVC拦截器实现,记录访问请求日志

Spring MVC拦截器实现,记录访问请求日志

时间:2024-04-24 15:55:05浏览次数:27  
标签:拦截器 log Spring springframework MVC private import org servlet

Spring MVC拦截器实现,记录访问请求日志

1.创建拦截器类并实现HandlerInterceptor拦截器

package com.jxdinfo.hussar.sys.interceptor;

import com.jxdinfo.hussar.base.entity.UserInfo;
import com.jxdinfo.hussar.common.util.UserUtils;
import com.jxdinfo.hussar.core.util.IdGenerator;
import com.jxdinfo.hussar.sys.dto.OperateLog;
import com.jxdinfo.hussar.sys.mapper.OperateLogMapper;
import org.springframework.core.env.Environment;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executor;

public class RequestInterceptor implements HandlerInterceptor {

    //环境
    private Environment env;

    private Executor executor;

    private OperateLogMapper operateLogMapper;

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public RequestInterceptor(Environment env,OperateLogMapper operateLogMapper) {
        this.env = env;
        this.operateLogMapper = operateLogMapper;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        try {
            if (handler instanceof ResourceHttpRequestHandler) {
                // 处理静态资源的请求
                return true;
            }

            //其他请求

            UserInfo user = UserUtils.getUser();

            OperateLog log = new OperateLog();
            log.setId(IdGenerator.getId());
            log.setRequestUri(request.getRequestURI());
            log.setIp(InetAddress.getLocalHost().getHostAddress());
            log.setLoginName(user.getLoginName());
            log.setUserId(user.getId());
            log.setUserName(user.getUserName());
            log.setStartTime(dateFormat.format(new Date()));

            operateLogMapper.insertLog(log);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        try {
            if (handler instanceof ResourceHttpRequestHandler) {
                // 处理静态资源的请求
            } else {
                // 处理其他请求

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.注册拦截器(需实现WebMvcConfigurer)


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.util.concurrent.Executor;

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Autowired
    private Environment env;
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Resource(name = "requestLogThreadPool")
    private Executor taskExecutor;

    @Value("${requestLog.onState:false}")
    private Boolean requestLogOnState;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	//根据配置文件中的参数决定是否开启日志记录功能
        if (requestLogOnState) {
            InterceptorRegistration interceptorRegistration = registry.addInterceptor(new RequestInterceptor(env, jdbcTemplate, taskExecutor));
            interceptorRegistration.addPathPatterns("/**");
            interceptorRegistration.excludePathPatterns("/static/**");
        }
    }
}


标签:拦截器,log,Spring,springframework,MVC,private,import,org,servlet
From: https://www.cnblogs.com/huoxiaoguo/p/18155644

相关文章

  • 【Elasticsearch】在spring环境中 进行es的数据读取
    在Spring环境中进行Elasticsearch(ES)的数据读取,通常会利用SpringDataElasticsearch项目提供的功能。SpringDataElasticsearch提供了高度抽象的Repository接口,允许你以面向对象的方式操作Elasticsearch,而无需直接编写底层的HTTP请求或JSON解析代码。下面是一个简单的示例,演示如......
  • SpringMVC学习总结 + 【手写SpringMVC底层机制核心】
    SpringMVC笔记SpringMVC介绍基本介绍SpringMVC是WEB层框架,接管了Web层组件,支持MVC的开发模式/开发架构SpringMVC通过注解,让POJO成为控制器,不需要继承类或者实现接口SpringMVC采用低耦合的组件设计方式,具有更好扩展和灵活性.支持REST格式的URL请求.SpringMV......
  • springboot 结合jackson数据脱敏
     在返回字段时有时需要对电话,地址等字段进行脱敏处理1.定义枚举脱敏类使用函数编程,绑定函数操作publicenumDataMaskEnum{/***名称脱敏*/USERNAME(s->s.replaceAll("(\\S)\\S(\\S*)","$1*$2")),/***手机号脱敏*/......
  • 「Java开发指南」如何利用MyEclipse启用Spring DSL?(二)
    本教程将引导您通过启用SpringDSL和使用ServiceSpringDSL抽象来引导Spring和Spring代码生成项目,本教程中学习的技能也可以很容易地应用于其他抽象。在本教程中,您将学习如何:为SpringDSL初始化一个项目创建一个模型包创建一个服务和操作实现一个服务方法启用JAX-WS和DWR......
  • springboot源码:容器启动过程(扩展业务对象、bean 生命周期)&动态注册自己的业务对象&
    0.SpringbootRun方法启动org.springframework.boot.SpringApplication#run(java.lang.String...)启动 publicConfigurableApplicationContextrun(String...args){ longstartTime=System.nanoTime(); DefaultBootstrapContextbootstrapContext=createBootstrap......
  • 接口测试方法:Spring boot Test、python、postman
    一般的rest接口在pom.xml中加入org.springframework.bootspring-boot-starter-testtest新建测试类@RunWith(SpringRunner.class)@SpringBootTestpublicclassUserControllerTest{privateMockMvcmvc;//初始化执行@BeforepublicvoidsetUp()throwsException......
  • Axios 请求拦截器和响应拦截器配置
    简易模式 importaxiosfrom'axios'constaxiosInstance=axios.create({  baseURL:baseUrl,  timeout:1000*60*1,  responseType:'json',  insecureHTTPParser:true,  headers:{    'Content-Type':'......
  • springboot~mybatis-plus中使用TypeHandler做类型映射
    mybatis-plus中,如果数据表字段类型与java实体字段类型不一样,这时就需要做类型映射与转换了,我们一般可以实现TypeHandler接口,或者继承抽象类BaseTypeHandler,我们下面举例来说明一下它的使用方法。场景数据表里字段是varchar,java里是List集合,例如:我的爱好标签数据表里字段是varc......
  • SpringCloud(十)ES 进阶 -- 数据同步
    Demo案例,两个微服务项目,一个操作MySql,一个操作EShotel-admin:酒店管理微服务demo,实现对酒店信息的增、删、改(操作MySql)hotel-demo:ESdemo,实现了对索引库、文档的操作,以及高亮显示、搜索自动补全功能(操作ES)Demo源码下载地址(两个微服务在一起):链接:https://pan.baidu.com/s/1nPTCnL......
  • SpringBoot整合OpenAPI 3生成在线接口文档
    SpringBoot整合springdoc-openapi,自动生成在线接口文档。1、引入pom依赖<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.3.0</version></dependenc......