package org.springblade.modules.system.service.impl;
|
|
import lombok.AllArgsConstructor;
|
import org.springblade.core.log.model.LogApi;
|
import org.springblade.core.log.model.LogError;
|
import org.springblade.core.log.model.LogUsual;
|
import org.springblade.core.secure.exception.SecureException;
|
import org.springblade.core.tool.utils.Charsets;
|
import org.springblade.core.tool.utils.Func;
|
import org.springblade.modules.system.service.ILogApiService;
|
import org.springblade.modules.system.service.ILogErrorService;
|
import org.springblade.modules.system.service.ILogService;
|
import org.springblade.modules.system.service.ILogUsualService;
|
import org.springblade.modules.system.entity.LogApiExt;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.ServletRequestEvent;
|
import javax.servlet.ServletRequestListener;
|
import javax.servlet.http.HttpServletRequest;
|
import java.io.UnsupportedEncodingException;
|
import java.util.Base64;
|
import java.util.Objects;
|
|
/**
|
* Created by Blade.
|
*
|
* @author zhuangqian
|
*/
|
@Service
|
@AllArgsConstructor
|
public class LogServiceImpl implements ILogService, ServletRequestListener {
|
|
private HttpServletRequest request = null;
|
|
@Override
|
public void requestInitialized(ServletRequestEvent sre) {
|
request = (HttpServletRequest) sre.getServletRequest();
|
}
|
|
@Override
|
public void requestDestroyed(ServletRequestEvent sre) {
|
|
}
|
|
private final ILogUsualService usualService;
|
private final ILogApiService apiService;
|
private final ILogErrorService errorService;
|
|
@Override
|
public Boolean saveUsualLog(LogUsual log) {
|
return usualService.save(log);
|
}
|
|
@Override
|
public Boolean saveApiLog(LogApi log) {
|
LogApiExt api = new LogApiExt();
|
try {
|
String[] tokens = extractAndDecodeHeader();
|
api.setApplicationId(tokens[0]);
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
api.setTitle(log.getTitle());
|
api.setTime(log.getTime());
|
api.setTenantId(log.getTenantId());
|
api.setServiceId(log.getServiceId());
|
api.setServerIp(log.getServerIp());
|
api.setEnv(log.getEnv());
|
api.setServerHost(log.getServerHost());
|
api.setRemoteIp(log.getRemoteIp());
|
api.setRequestUri(log.getRequestUri());
|
api.setUserAgent(log.getUserAgent());
|
api.setMethod(log.getMethod());
|
api.setMethodName(log.getMethodName());
|
api.setMethodClass(log.getMethodClass());
|
api.setCreateTime(log.getCreateTime());
|
api.setCreateBy(log.getCreateBy());
|
if (log.getRequestUri().equals("/blade-auth/oauth/token")){
|
api.setType("1");
|
}else {
|
api.setType("2");
|
}
|
// 保存
|
return apiService.save(api);
|
}
|
|
|
|
@Override
|
public Boolean saveErrorLog(LogError log) {
|
return errorService.save(log);
|
}
|
|
/**
|
* 清理时间范围外的日志记录信息
|
* @param param
|
* @return
|
*/
|
@Override
|
public boolean removeLogs(String param) {
|
usualService.removeByTime();
|
apiService.removeByTime();
|
errorService.removeByTime();
|
return true;
|
}
|
|
/**
|
* 解析请求头
|
* @return
|
*/
|
public String[] extractAndDecodeHeader() throws UnsupportedEncodingException {
|
try {
|
String header = ((HttpServletRequest) Objects.requireNonNull(request)).getHeader("Authorization");
|
header = Func.toStr(header).replace("Basic%20", "Basic ");
|
if (!header.startsWith("Basic ")) {
|
throw new SecureException("未获取到请求头[Authorization]的信息");
|
} else {
|
byte[] base64Token = header.substring(6).getBytes(Charsets.UTF_8_NAME);
|
|
byte[] decoded;
|
try {
|
decoded = Base64.getDecoder().decode(base64Token);
|
} catch (IllegalArgumentException var5) {
|
throw new RuntimeException("客户端令牌解析失败");
|
}
|
|
String token = new String(decoded, Charsets.UTF_8_NAME);
|
int index = token.indexOf(":");
|
if (index == -1) {
|
throw new RuntimeException("客户端令牌不合法");
|
} else {
|
return new String[]{token.substring(0, index), token.substring(index + 1)};
|
}
|
}
|
} catch (Throwable var6) {
|
throw var6;
|
}
|
}
|
|
}
|