一、定义访问日志内容记录实体类
@Data
public class AccessLog {
private String username;
private String url;
private Integer duration;
private String httpMethod;
private Integer httpStatus;
private String ip;
private Date createTime;
}
二、自定义日志拦截器
@Slf4j
public class AccessLogInterceptor implements HandlerInterceptor {
private static final String LOGGER_SEND_TIME = "SEND_TIME";
private static final String LOGGER_ACCESSLOG = "ACCESSLOG_ENTITY";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
AccessLog accessLog = new AccessLog();
accessLog.setIp(AdrressIpUtils.getIpAdrress(request));
accessLog.setHttpMethod(request.getMethod());
accessLog.setUrl(request.getRequestURI());
request.setAttribute(LOGGER_SEND_TIME,System.currentTimeMillis());
request.setAttribute(LOGGER_ACCESSLOG,accessLog);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
AccessLog accessLog = (AccessLog) request.getAttribute(LOGGER_ACCESSLOG);
int status = response.getStatus();
accessLog.setHttpStatus(status);
accessLog.setUsername("admin");
long currentTime = System.currentTimeMillis();
long snedTime = Long.valueOf(request.getAttribute(LOGGER_SEND_TIME).toString());
accessLog.setDuration(Integer.valueOf((currentTime - snedTime)+""));
accessLog.setCreateTime(new Date());
log.info(accessLog.toString());
}
}
三、拦截器注册
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
private final String[] excludePath = {"/static"};
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AccessLogInterceptor()).addPathPatterns("/**").excludePathPatterns(excludePath);
}
}
四、获取ip访问地址的工具类
public class AdrressIpUtils {
public static String getIpAdrress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
int index = XFor.indexOf(",");
if(index != -1){
return XFor.substring(0,index);
}else{
return XFor;
}
}
XFor = Xip;
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
return XFor;
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return XFor;
}
}