| | |
| | | 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. |
| | |
| | | */ |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class LogServiceImpl implements ILogService { |
| | | 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; |
| | |
| | | |
| | | @Override |
| | | public Boolean saveApiLog(LogApi log) { |
| | | return apiService.save(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; |
| | | } |
| | | } |
| | | |
| | | } |