【add】关键接口日志记录功能实现,优化IP获取方式

This commit is contained in:
nixj 2024-06-27 08:49:40 +08:00
parent 3b14f26a76
commit e80b644f62
6 changed files with 222 additions and 3 deletions

View File

@ -0,0 +1,72 @@
package com.chint.infrastructure.config.LogConfig;
import com.chint.domain.aggregates.user.User;
import com.chint.infrastructure.util.BaseContext;
import com.chint.manage.entity.CruxSystemLogBasic;
import com.chint.manage.mapper.JdbcCruxSystemLogBasicRepository;
import com.chint.manage.util.IpAddressUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
@Slf4j
@Component
public class CruxLogInterceptor implements HandlerInterceptor {
@Autowired
private JdbcCruxSystemLogBasicRepository jdbcCruxSystemLogBasicRepository;
@Autowired
private IpAddressUtil ipAddressUtil;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在请求处理之前进行拦截
// 获取请求IP
String clientIP = ipAddressUtil.getIpAddress(request);
// 获取请求URL
String url = request.getRequestURL().toString();
// 获取请求方法
String method = request.getMethod();
// 获取url中的请求参数
String params = request.getQueryString() == null ? "" : request.getQueryString();
//请求体数据
String requestBody = "";
if ("POST".equals(method)) {
requestBody = ContentCachingWrapperFilter.getRequestBody(request);
}
requestBody = requestBody.replaceAll("\\s+", "");
//如果有获取用户
User user = BaseContext.getCurrentUser();
String employeeNo = "";
String name = "";
if (!Objects.isNull(user)) {
employeeNo = user.getEmployeeNo();
name = user.getName();
}
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String accessTime = now.format(formatter);
//构建对象
CruxSystemLogBasic systemLog = CruxSystemLogBasic.builder()
.clientIp(clientIP)
.url(url)
.method(method)
.params(params)
.requestBody(requestBody)
.employeeNo(employeeNo)
.name(name)
.accessTime(accessTime).build();
jdbcCruxSystemLogBasicRepository.save(systemLog);
}
}

View File

@ -1,10 +1,9 @@
package com.chint.infrastructure.config.webconfig;
import com.chint.infrastructure.config.LogConfig.CruxLogInterceptor;
import com.chint.infrastructure.config.LogConfig.RequestLoggingInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -24,6 +23,14 @@ public class WebConfig implements WebMvcConfigurer {
return new RequestLoggingInterceptor();
}
/**
* 关键接口日志记录
*/
@Bean
public CruxLogInterceptor getCruxLogInterceptor() {
return new CruxLogInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JwtTokenAdminInterceptor())
@ -35,6 +42,14 @@ public class WebConfig implements WebMvcConfigurer {
registry.addInterceptor(getMyRequestLoggingInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/location/**", "/**/query/**", "/**/pageQuery/**");
//关键接口日志记录
registry.addInterceptor(getCruxLogInterceptor())
//报表
.addPathPatterns("/manage/consumption/export","/manage/standard/export","/manage/order/export",
//公告
"/system/announcement/save","/system/announcement/update",
//权限
"/users/add/role","/users/edit/role");
}
@Override

View File

@ -0,0 +1,53 @@
package com.chint.manage.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import java.io.Serial;
import java.io.Serializable;
/**
*
* @author xx CruxSystemLogBasic.java
*
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table("crux_system_log")
public class CruxSystemLogBasic implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id
private Integer id;
/**员工SF号**/
private String employeeNo;
/**员工姓名**/
private String name;
/**访问时间**/
private String accessTime;
/**请求IP**/
private String clientIp;
/**请求路径**/
private String url;
/**请求方法**/
private String method;
/**参数**/
private String params;
/**请求体**/
private String requestBody;
}

View File

@ -0,0 +1,15 @@
package com.chint.manage.mapper;
import com.chint.manage.entity.CruxSystemLogBasic;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
/**
*
* @author xx JdbcCruxSystemLogBasicRepository数据库操作接口类
*
**/
@Repository
public interface JdbcCruxSystemLogBasicRepository extends CrudRepository<CruxSystemLogBasic,Long> {
}

View File

@ -39,7 +39,7 @@ public class DataJdbcCreatorUtil {
*/
private List<String> getTables() throws SQLException {
List<String> tables = new ArrayList<String>();
tables.add("order_detail");
tables.add("crux_system_log");
return tables;
}

View File

@ -0,0 +1,64 @@
package com.chint.manage.util;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 获取IP工具类
* 如果是IP白名单限制应该直接使用request.getRemoteAddr()
* 这个无法伪造
* @Authornxj
* @Date2020/6/24 9:20
*/
@Component
public class IpAddressUtil {
private static final String LOCAL = "0:0:0:0:0:0:0:1";
public String getIpAddress(HttpServletRequest request) {
String ip = null;
//X-Forwarded-ForSquid 服务代理
String ipAddresses = request.getHeader("X-Forwarded-For");
String unknown = "unknown";
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//Proxy-Client-IPapache 服务代理
ipAddresses = request.getHeader("Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//WL-Proxy-Client-IPweblogic 服务代理
ipAddresses = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//HTTP_CLIENT_IP有些代理服务器
ipAddresses = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//X-Real-IPnginx服务代理
ipAddresses = request.getHeader("X-Real-IP");
}
//有些网络通过多层代理那么获取到的ip就会有多个一般都是通过逗号,分割开来并且第一个ip为客户端的真实IP
if (ipAddresses != null && ipAddresses.length() != 0) {
ip = ipAddresses.split(",")[0];
}
//还是不能获取到最后再通过request.getRemoteAddr();获取
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
ip = request.getRemoteAddr();
}
if(LOCAL.equals(ip)){
return "127.0.0.1";
}
return ip;
}
}