美文网首页软件
Sping记录Http请求log

Sping记录Http请求log

作者: menglj | 来源:发表于2017-12-06 22:24 被阅读2次

    有时候我们要记录下所有的http请求信息(请求的方法,比如GET;请求的uri,比如/api/v1/users等信息),在spring框架下,很容易实现这个需求。

    在spring框架下,用户可以自定义web请求处理前后的拦截器,其中HandlerInterceptor接口是我们可以利用的。这个接口定义了3个函数:我们只需要实现这3个接口,就可以拦截到所有的web请求信息。

    具体做法:

    1. 编写HandlerInterceptor实现类,重写其中的方法,这里重写了方法postHandle,这个调用是在web请求成功处理后被调用。
    public class PlatformRequestInterceptor implements HandlerInterceptor {
        @Autowired
        private PlatformAccessLogRepository repository;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            //这里没有直接读取request对象,而是通过`ContentCachingRequestWrapper`类先进行一次缓存,原因参考参考文档[1]
            HttpServletRequest requestCacheWrapperObject
                    = new ContentCachingRequestWrapper(request);
            requestCacheWrapperObject.getParameterMap();
    
            String uri = requestCacheWrapperObject.getRequestURI();
            if (!uri.equals("/error")) {
                String method = requestCacheWrapperObject.getMethod();
                String userName = "guest";
                if (requestCacheWrapperObject.getUserPrincipal() != null) {
                    userName = requestCacheWrapperObject.getUserPrincipal().getName();
                }
                String remoteAddr = requestCacheWrapperObject.getRemoteAddr();
                PlatformAccessLog accessLog = new PlatformAccessLog();
                accessLog.setMethod(method);
                accessLog.setName(userName);
                accessLog.setPath(uri);
                accessLog.setTime(new Date());
                accessLog.setRemoteAddr(remoteAddr);
                repository.insert(accessLog);
            }
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
        }
    }
    
    1. 注册上面写好的拦截器实现,重载WebMvcConfigurerAdapteraddInterceptors方法。
    @Configuration
    public class PlatformMVCConfig extends WebMvcConfigurerAdapter {
        @Autowired
        private HandlerInterceptor interceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(interceptor);
        }
    }
    

    经过上面的操作,就可以把所有正常处理的http请求记录到mongodb中了。写入数据库的代码略。

    参考文档

    1. Spring – Log Incoming Requests

    相关文章

      网友评论

        本文标题:Sping记录Http请求log

        本文链接:https://www.haomeiwen.com/subject/vkfrixtx.html