From 32c340a0367836393058f3dfbb8dd16c00d85974 Mon Sep 17 00:00:00 2001 From: kl Date: Mon, 13 Oct 2025 11:14:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/pom.xml | 9 +++++++++ server/src/main/config/application.properties | 8 ++++++++ .../java/cn/keking/service/FileConvertQueueTask.java | 2 +- .../java/cn/keking/service/FileHandlerService.java | 8 ++++---- .../cn/keking/service/impl/CadFilePreviewImpl.java | 5 ++++- .../cn/keking/service/impl/JsonFilePreviewImpl.java | 11 +++++------ .../cn/keking/service/impl/MediaFilePreviewImpl.java | 7 +++++-- .../keking/service/impl/SimTextFilePreviewImpl.java | 11 +++++------ server/src/main/java/cn/keking/utils/OfficeUtils.java | 7 +++++-- server/src/main/java/cn/keking/utils/RarUtils.java | 6 +++++- .../java/cn/keking/utils/SimpleEncodingDetects.java | 9 +++++++-- server/src/main/java/cn/keking/utils/WebUtils.java | 4 ++-- .../java/cn/keking/web/filter/TrustDirFilter.java | 2 +- .../java/cn/keking/web/filter/TrustHostFilter.java | 5 ++++- 14 files changed, 65 insertions(+), 29 deletions(-) diff --git a/server/pom.xml b/server/pom.xml index e4601a6f1..1f5e46a7e 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -50,6 +50,15 @@ org.springframework.boot spring-boot-starter-freemarker + + org.springframework.boot + spring-boot-starter-actuator + + + org.projectlombok + lombok + true + diff --git a/server/src/main/config/application.properties b/server/src/main/config/application.properties index 0099bc544..c8b6450d0 100644 --- a/server/src/main/config/application.properties +++ b/server/src/main/config/application.properties @@ -22,6 +22,14 @@ spring.freemarker.expose-request-attributes = true spring.freemarker.expose-session-attributes = true spring.freemarker.request-context-attribute = request spring.freemarker.suffix = .ftl +# Spring Boot Actuator 健康检查配置 +# 开启健康检查端点 +management.endpoints.web.exposure.include=health,info,metrics +# 显示详细的健康检查信息(生产环境建议设置为when-authorized) +management.endpoint.health.show-details=always +# 启用健康检查组件 +management.health.defaults.enabled=true + # office设置 #openoffice或LibreOffice home路径 diff --git a/server/src/main/java/cn/keking/service/FileConvertQueueTask.java b/server/src/main/java/cn/keking/service/FileConvertQueueTask.java index 3da38d3cf..6096b92bd 100644 --- a/server/src/main/java/cn/keking/service/FileConvertQueueTask.java +++ b/server/src/main/java/cn/keking/service/FileConvertQueueTask.java @@ -73,7 +73,7 @@ public void run() { TimeUnit.SECONDS.sleep(10); } catch (Exception ex) { Thread.currentThread().interrupt(); - ex.printStackTrace(); + logger.error("Failed to sleep after exception", ex); } logger.info("处理预览转换任务异常,url:{}", url, e); } diff --git a/server/src/main/java/cn/keking/service/FileHandlerService.java b/server/src/main/java/cn/keking/service/FileHandlerService.java index caecdccc6..a10a0819a 100644 --- a/server/src/main/java/cn/keking/service/FileHandlerService.java +++ b/server/src/main/java/cn/keking/service/FileHandlerService.java @@ -178,13 +178,13 @@ public void doActionConvertedFile(String outFilePath) { sb.append(""); sb.append(""); } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to read file: {}", outFilePath, e); } // 重新写入文件 try (FileOutputStream fos = new FileOutputStream(outFilePath); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8))) { writer.write(sb.toString()); } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to write file: {}", outFilePath, e); } } @@ -477,14 +477,14 @@ public FileAttribute getFileAttribute(String url, HttpServletRequest req) { originFileName = URLDecoder.decode(originFileName, uriEncoding); //转义的文件名 解下出原始文件名 attribute.setSkipDownLoad(true); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + logger.error("Failed to decode file name: {}", originFileName, e); } } if (UrlEncoderUtils.hasUrlEncoded(originFileName)) { //判断文件名是否转义 try { originFileName = URLDecoder.decode(originFileName, uriEncoding); //转义的文件名 解下出原始文件名 } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + logger.error("Failed to decode file name: {}", originFileName, e); } }else { url = WebUtils.encodeUrlFileName(url); //对未转义的url进行转义 diff --git a/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java b/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java index 155821c33..6f75fce70 100644 --- a/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java +++ b/server/src/main/java/cn/keking/service/impl/CadFilePreviewImpl.java @@ -9,6 +9,8 @@ import cn.keking.utils.KkFileUtils; import cn.keking.utils.WebUtils; import cn.keking.web.filter.BaseUrlFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.ui.Model; import org.springframework.util.StringUtils; @@ -22,6 +24,7 @@ @Service public class CadFilePreviewImpl implements FilePreview { + private static final Logger logger = LoggerFactory.getLogger(CadFilePreviewImpl.class); private static final String OFFICE_PREVIEW_TYPE_IMAGE = "image"; private static final String OFFICE_PREVIEW_TYPE_ALL_IMAGES = "allImages"; @@ -55,7 +58,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri try { imageUrls = fileHandlerService.cadToPdf(filePath, outFilePath, cadPreviewType, fileAttribute); } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to convert CAD file: {}", filePath, e); } if (imageUrls == null) { return otherFilePreview.notSupportedFile(model, fileAttribute, "CAD转换异常,请联系管理员"); diff --git a/server/src/main/java/cn/keking/service/impl/JsonFilePreviewImpl.java b/server/src/main/java/cn/keking/service/impl/JsonFilePreviewImpl.java index b5d15714c..18e0f559d 100644 --- a/server/src/main/java/cn/keking/service/impl/JsonFilePreviewImpl.java +++ b/server/src/main/java/cn/keking/service/impl/JsonFilePreviewImpl.java @@ -7,6 +7,8 @@ import cn.keking.service.FilePreview; import cn.keking.utils.DownloadUtils; import cn.keking.utils.KkFileUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.stereotype.Service; import org.springframework.ui.Model; @@ -23,17 +25,14 @@ * @since 2025/01/11 * JSON 文件预览处理实现 */ +@Slf4j @Service +@RequiredArgsConstructor public class JsonFilePreviewImpl implements FilePreview { private final FileHandlerService fileHandlerService; private final OtherFilePreviewImpl otherFilePreview; - public JsonFilePreviewImpl(FileHandlerService fileHandlerService, OtherFilePreviewImpl otherFilePreview) { - this.fileHandlerService = fileHandlerService; - this.otherFilePreview = otherFilePreview; - } - @Override public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) { String fileName = fileAttribute.getName(); @@ -64,7 +63,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri try { fileData = HtmlUtils.htmlEscape(readJsonFile(filePath, fileName)); } catch (IOException e) { - e.printStackTrace(); + log.error("读取JSON文件失败: {}", filePath, e); } String base64Data = Base64.encodeBase64String(fileData.getBytes(StandardCharsets.UTF_8)); model.addAttribute("textData", base64Data); diff --git a/server/src/main/java/cn/keking/service/impl/MediaFilePreviewImpl.java b/server/src/main/java/cn/keking/service/impl/MediaFilePreviewImpl.java index c0ada479b..608deae4e 100644 --- a/server/src/main/java/cn/keking/service/impl/MediaFilePreviewImpl.java +++ b/server/src/main/java/cn/keking/service/impl/MediaFilePreviewImpl.java @@ -11,6 +11,8 @@ import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.Frame; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.ui.Model; import org.springframework.util.ObjectUtils; @@ -26,6 +28,7 @@ @Service public class MediaFilePreviewImpl implements FilePreview { + private static final Logger logger = LoggerFactory.getLogger(MediaFilePreviewImpl.class); private final FileHandlerService fileHandlerService; private final OtherFilePreviewImpl otherFilePreview; private static final String mp4 = "mp4"; @@ -66,7 +69,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri convertedUrl = outFilePath; //其他协议的 不需要转换方式的文件 直接输出 } } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to convert media file: {}", filePath, e); } if (convertedUrl == null) { return otherFilePreview.notSupportedFile(model, fileAttribute, "视频转换异常,请联系管理员"); @@ -148,7 +151,7 @@ private static String convertToMp4(String filePath, String outFilePath, FileAttr recorder.record(captured_frame); } } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to convert video file to mp4: {}", filePath, e); return null; } finally { if (recorder != null) { //关闭 diff --git a/server/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java b/server/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java index ce7c6d677..64a8e9e56 100644 --- a/server/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java +++ b/server/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java @@ -8,6 +8,8 @@ import cn.keking.utils.DownloadUtils; import cn.keking.utils.EncodingDetects; import cn.keking.utils.KkFileUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.stereotype.Service; import org.springframework.ui.Model; @@ -20,17 +22,14 @@ * Created by kl on 2018/1/17. * Content :处理文本文件 */ +@Slf4j @Service +@RequiredArgsConstructor public class SimTextFilePreviewImpl implements FilePreview { private final FileHandlerService fileHandlerService; private final OtherFilePreviewImpl otherFilePreview; - public SimTextFilePreviewImpl(FileHandlerService fileHandlerService,OtherFilePreviewImpl otherFilePreview) { - this.fileHandlerService = fileHandlerService; - this.otherFilePreview = otherFilePreview; - } - @Override public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) { String fileName = fileAttribute.getName(); @@ -57,7 +56,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri try { fileData = HtmlUtils.htmlEscape(textData(filePath,fileName)); } catch (IOException e) { - e.printStackTrace(); + log.error("读取文本文件失败: {}", filePath, e); } model.addAttribute("textData", Base64.encodeBase64String(fileData.getBytes(StandardCharsets.UTF_8))); return TXT_FILE_PREVIEW_PAGE; diff --git a/server/src/main/java/cn/keking/utils/OfficeUtils.java b/server/src/main/java/cn/keking/utils/OfficeUtils.java index fb60423f6..ac828b677 100644 --- a/server/src/main/java/cn/keking/utils/OfficeUtils.java +++ b/server/src/main/java/cn/keking/utils/OfficeUtils.java @@ -4,6 +4,8 @@ import org.apache.poi.EncryptedDocumentException; import org.apache.poi.extractor.ExtractorFactory; import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -18,6 +20,7 @@ */ public class OfficeUtils { + private static final Logger logger = LoggerFactory.getLogger(OfficeUtils.class); private static final String POI_INVALID_PASSWORD_MSG = "password"; /** @@ -49,7 +52,7 @@ public static boolean isPwdProtected(String path) { try { propStream.close();//关闭文件输入流 } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to close input stream for file: {}", path, e); } } } @@ -76,7 +79,7 @@ public static synchronized boolean isCompatible(String path, String password) { try { propStream.close();//关闭文件输入流 } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to close input stream for file: {}", path, e); } } } diff --git a/server/src/main/java/cn/keking/utils/RarUtils.java b/server/src/main/java/cn/keking/utils/RarUtils.java index 795f91305..6a46d392e 100644 --- a/server/src/main/java/cn/keking/utils/RarUtils.java +++ b/server/src/main/java/cn/keking/utils/RarUtils.java @@ -1,6 +1,9 @@ package cn.keking.utils; import cn.keking.config.ConfigConstants; import cn.keking.service.ZtreeNodeVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.File; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; @@ -15,6 +18,7 @@ * create : 2023-04-08 **/ public class RarUtils { + private static final Logger logger = LoggerFactory.getLogger(RarUtils.class); private static final String fileDir = ConfigConstants.getFileDir(); public static byte[] getUTF8BytesFromGBKString(String gbkStr) { @@ -55,7 +59,7 @@ public static String getUtf8String(String str) { str = new String(getUTF8BytesFromGBKString(str), StandardCharsets.UTF_8); } } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + logger.error("Failed to convert string encoding: {}", str, e); } } return str; diff --git a/server/src/main/java/cn/keking/utils/SimpleEncodingDetects.java b/server/src/main/java/cn/keking/utils/SimpleEncodingDetects.java index 19e138bb7..5b1aec4c3 100644 --- a/server/src/main/java/cn/keking/utils/SimpleEncodingDetects.java +++ b/server/src/main/java/cn/keking/utils/SimpleEncodingDetects.java @@ -1,5 +1,8 @@ package cn.keking.utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -31,6 +34,8 @@ */ public class SimpleEncodingDetects { + private static final Logger logger = LoggerFactory.getLogger(SimpleEncodingDetects.class); + /** * 得到文件的编码 * @param content 文件内容 @@ -65,10 +70,10 @@ public static void readFile(String file, String code) { } catch (FileNotFoundException e) { // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("File not found: {}", file, e); } catch (IOException e) { // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("Failed to read file: {}", file, e); } } diff --git a/server/src/main/java/cn/keking/utils/WebUtils.java b/server/src/main/java/cn/keking/utils/WebUtils.java index 53cedb888..f62862cfb 100644 --- a/server/src/main/java/cn/keking/utils/WebUtils.java +++ b/server/src/main/java/cn/keking/utils/WebUtils.java @@ -87,7 +87,7 @@ public static String urlEncoderencode(String urlStr) { try { urlStr = URLEncoder.encode(urlStr, "UTF-8").replaceAll("\\+", "%20").replaceAll("%3A", ":").replaceAll("%2F", "/").replaceAll("%3F", "?").replaceAll("%26", "&").replaceAll("%3D", "="); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + LOGGER.error("Failed to encode URL: {}", urlStr, e); } } return urlStr; @@ -155,7 +155,7 @@ public static String getFileNameFromURL(String url) { URL urlObj = new URL(url); url = urlObj.getPath().substring(1); } catch (MalformedURLException e) { - e.printStackTrace(); + LOGGER.error("Failed to parse file URL: {}", url, e); } } // 因为url的参数中可能会存在/的情况,所以直接url.lastIndexOf("/")会有问题 diff --git a/server/src/main/java/cn/keking/web/filter/TrustDirFilter.java b/server/src/main/java/cn/keking/web/filter/TrustDirFilter.java index f5c5c1f49..c71a21eca 100644 --- a/server/src/main/java/cn/keking/web/filter/TrustDirFilter.java +++ b/server/src/main/java/cn/keking/web/filter/TrustDirFilter.java @@ -35,7 +35,7 @@ public void init(FilterConfig filterConfig) { byte[] bytes = FileCopyUtils.copyToByteArray(classPathResource.getInputStream()); this.notTrustDirView = new String(bytes, StandardCharsets.UTF_8); } catch (IOException e) { - e.printStackTrace(); + logger.error("加载notTrustDir.html失败", e); } } diff --git a/server/src/main/java/cn/keking/web/filter/TrustHostFilter.java b/server/src/main/java/cn/keking/web/filter/TrustHostFilter.java index 6282e162c..067a347e6 100644 --- a/server/src/main/java/cn/keking/web/filter/TrustHostFilter.java +++ b/server/src/main/java/cn/keking/web/filter/TrustHostFilter.java @@ -13,6 +13,8 @@ import jakarta.servlet.ServletResponse; import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.FileCopyUtils; @@ -22,6 +24,7 @@ */ public class TrustHostFilter implements Filter { + private static final Logger logger = LoggerFactory.getLogger(TrustHostFilter.class); private String notTrustHostHtmlView; @Override @@ -32,7 +35,7 @@ public void init(FilterConfig filterConfig) { byte[] bytes = FileCopyUtils.copyToByteArray(classPathResource.getInputStream()); this.notTrustHostHtmlView = new String(bytes, StandardCharsets.UTF_8); } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to load notTrustHost.html file", e); } }