1、创建一个filter 过滤器类,并集成 OncePerRequestFilter
OncePerRequestFilter,顾名思义,它能够确保在一次请求中只通过一次filter
2、实现代码如下:
@Component
@Order(0)
public class LogFilter extends OncePerRequestFilter {
@Autowired
private UserBehaviorLogService userBehaviorLogService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
Long start=System.currentTimeMillis();
request.setAttribute("startTime",start);
//执行下一个拦截器
filterChain.doFilter(request, response);
} finally {
String method=request.getRequestURI();
if(!method.contains("swagger")&&!method.contains("api-docs")){
Long start=(long)request.getAttribute("startTime");
Long elapsedTime=System.currentTimeMillis()-start;
Long userId= AuthUtils.getReqUserId(request)==null?0l: AuthUtils.getReqUserId(request);
String ip=request.getRemoteAddr();
UserBehaviorLog userBehaviorLog=new UserBehaviorLog();
userBehaviorLog.setUserId(userId);
userBehaviorLog.setElapsedTime(elapsedTime);
userBehaviorLog.setMethod(method);
userBehaviorLog.setIp(ip);
userBehaviorLog.setVersion(request.getHeader("version"));
userBehaviorLog.setDeviceType(request.getHeader("deviceType"));
//保存数据库
userBehaviorLogService.save(userBehaviorLog);
}
}
}
}
``
网友评论