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); } /** * 解析请求头 * @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; } } }