diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb
index 0c4a296..d1256d3 100644
--- a/.idea/sonarlint/issuestore/index.pb
+++ b/.idea/sonarlint/issuestore/index.pb
@@ -38,4 +38,38 @@ Bserver/src/main/java/cn/keking/web/filter/SecurityFilterProxy.java,f/a/fafbe7b
 ]
 -.idea/sonarlint/securityhotspotstore/index.pb,8/8/88a9255124c95bdc913197c120a8d560edc59c8e
 S
-#.idea/sonarlint/issuestore/index.pb,9/f/9fe84ebb15faf917b7def6236dba604453cc61e0
\ No newline at end of file
+#.idea/sonarlint/issuestore/index.pb,9/f/9fe84ebb15faf917b7def6236dba604453cc61e0
+7
+pom.xml,4/4/442292b8a7efeabbe4cc176709b833b1792140ec
+>
+server/pom.xml,0/8/08a8b343eb3d041b4e874e74bf19e4275b4be110
+g
+7server/src/test/java/cn/keking/utils/WebUtilsTests.java,3/e/3e79bd1b4bddcf9e4afa1150d7aa1111229f9608
+a
+1server/src/test/java/cn/keking/EncodingTests.java,9/9/991f5c827ba342fb9556f7a8d9e25c5094f8d194
+N
+server/src/main/bin/install.sh,9/6/9670fa2ec929863749a61f96cd9905ef7e149ca4
+O
+server/src/main/bin/shutdown.sh,4/d/4d8cce4780bc894d67bb148d8cc32ca2ee3734bd
+N
+server/src/main/bin/startup.sh,e/c/ec8bdf7dfbb78af66b10bd691ef0caf968454088
+O
+server/src/main/bin/startup.bat,f/5/f5c0416d0338de26cf05e386ea253ee576a792ed
+N
+server/src/main/bin/showlog.sh,4/8/48e540d461c0d4ff8b816b728de64deeb5236ae5
+e
+5server/src/main/java/cn/keking/utils/AesCbcUtils.java,3/f/3fbe3b97dec53d163218ab2f22743509689a5078
+p
+@server/src/main/java/cn/keking/web/filter/ChinesePathFilter.java,c/6/c6861fb4e27b5392cddd73d03e7d0fd3e5d8f908
+n
+>server/src/main/java/cn/keking/web/filter/TrustHostFilter.java,6/2/62c81e3eb6c898408ab47308876c2d8d46d29d06
+m
+=server/src/main/java/cn/keking/web/filter/UrlCheckFilter.java,0/9/09e45d93c20a87e06fd58f06c9bb8b309e1f372d
+d
+4server/src/main/java/cn/keking/config/WebConfig.java,0/3/033fa741a1880d30fab3660e661aaebf1534dc5c
+j
+:server/src/main/java/cn/keking/web/filter/TokenFilter.java,c/b/cb9e5dd41aa32dc77ca8dd9c998c374fa44acad3
+l
+<server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java,3/9/3970ff059e3bd314031548728b90483ed6fad407
+q
+Aserver/src/main/java/cn/keking/web/filter/AttributeSetFilter.java,b/2/b257284909fcfa39a42303466b8f9a7be032cc03
\ No newline at end of file
diff --git a/.idea/sonarlint/securityhotspotstore/index.pb b/.idea/sonarlint/securityhotspotstore/index.pb
index 0c4a296..d1256d3 100644
--- a/.idea/sonarlint/securityhotspotstore/index.pb
+++ b/.idea/sonarlint/securityhotspotstore/index.pb
@@ -38,4 +38,38 @@ Bserver/src/main/java/cn/keking/web/filter/SecurityFilterProxy.java,f/a/fafbe7b
 ]
 -.idea/sonarlint/securityhotspotstore/index.pb,8/8/88a9255124c95bdc913197c120a8d560edc59c8e
 S
-#.idea/sonarlint/issuestore/index.pb,9/f/9fe84ebb15faf917b7def6236dba604453cc61e0
\ No newline at end of file
+#.idea/sonarlint/issuestore/index.pb,9/f/9fe84ebb15faf917b7def6236dba604453cc61e0
+7
+pom.xml,4/4/442292b8a7efeabbe4cc176709b833b1792140ec
+>
+server/pom.xml,0/8/08a8b343eb3d041b4e874e74bf19e4275b4be110
+g
+7server/src/test/java/cn/keking/utils/WebUtilsTests.java,3/e/3e79bd1b4bddcf9e4afa1150d7aa1111229f9608
+a
+1server/src/test/java/cn/keking/EncodingTests.java,9/9/991f5c827ba342fb9556f7a8d9e25c5094f8d194
+N
+server/src/main/bin/install.sh,9/6/9670fa2ec929863749a61f96cd9905ef7e149ca4
+O
+server/src/main/bin/shutdown.sh,4/d/4d8cce4780bc894d67bb148d8cc32ca2ee3734bd
+N
+server/src/main/bin/startup.sh,e/c/ec8bdf7dfbb78af66b10bd691ef0caf968454088
+O
+server/src/main/bin/startup.bat,f/5/f5c0416d0338de26cf05e386ea253ee576a792ed
+N
+server/src/main/bin/showlog.sh,4/8/48e540d461c0d4ff8b816b728de64deeb5236ae5
+e
+5server/src/main/java/cn/keking/utils/AesCbcUtils.java,3/f/3fbe3b97dec53d163218ab2f22743509689a5078
+p
+@server/src/main/java/cn/keking/web/filter/ChinesePathFilter.java,c/6/c6861fb4e27b5392cddd73d03e7d0fd3e5d8f908
+n
+>server/src/main/java/cn/keking/web/filter/TrustHostFilter.java,6/2/62c81e3eb6c898408ab47308876c2d8d46d29d06
+m
+=server/src/main/java/cn/keking/web/filter/UrlCheckFilter.java,0/9/09e45d93c20a87e06fd58f06c9bb8b309e1f372d
+d
+4server/src/main/java/cn/keking/config/WebConfig.java,0/3/033fa741a1880d30fab3660e661aaebf1534dc5c
+j
+:server/src/main/java/cn/keking/web/filter/TokenFilter.java,c/b/cb9e5dd41aa32dc77ca8dd9c998c374fa44acad3
+l
+<server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java,3/9/3970ff059e3bd314031548728b90483ed6fad407
+q
+Aserver/src/main/java/cn/keking/web/filter/AttributeSetFilter.java,b/2/b257284909fcfa39a42303466b8f9a7be032cc03
\ No newline at end of file
diff --git a/server/src/main/config/application.properties b/server/src/main/config/application.properties
index 5de3dc1..c7048d4 100644
--- a/server/src/main/config/application.properties
+++ b/server/src/main/config/application.properties
@@ -125,7 +125,7 @@ pdf.bookmark.disable = ${KK_PDF_BOOKMARK_DISABLE:true}
 pdf.disable.editing = ${KK_PDF_DISABLE_EDITING:false}
 #office类型文档(word ppt)样式，默认为图片(image)，可配置为pdf（预览时也有按钮切换）
 #image or pdf
-office.preview.type = ${KK_OFFICE_PREVIEW_TYPE:pdf}
+office.preview.type = ${KK_OFFICE_PREVIEW_TYPE:image}
 #是否关闭office预览切换开关，默认为false，可配置为true关闭
 office.preview.switch.disabled = ${KK_OFFICE_PREVIEW_SWITCH_DISABLED:false}
 
@@ -188,4 +188,11 @@ cad.timeout =${KK_CAD_TIMEOUT:90}
 #Cad转换线程设置
 cad.thread =${KK_CAD_THREAD:5}
 
+#??????token,weiweiw,2024.5.17
+token.enable=${KK_TOKEN_ENABLE:true}
+#????
+token.expire.time=${KK_TOKEN_EXPIRE_TIME:10}
+
+
+
 
diff --git a/server/src/main/java/cn/keking/config/ConfigConstants.java b/server/src/main/java/cn/keking/config/ConfigConstants.java
index a65cabb..143947b 100644
--- a/server/src/main/java/cn/keking/config/ConfigConstants.java
+++ b/server/src/main/java/cn/keking/config/ConfigConstants.java
@@ -67,6 +67,8 @@ public class ConfigConstants {
     private static String homePagination;
     private static String homePageSize;
     private static String homeSearch;
+    private static Boolean tokenEnable;
+    private static int tokenExpireTime;
 
     public static final String DEFAULT_CACHE_ENABLED = "true";
     public static final String DEFAULT_TXT_TYPE = "txt,html,htm,asp,jsp,xml,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd,xbrl";
@@ -108,6 +110,7 @@ public class ConfigConstants {
     public static final String DEFAULT_HOME_PAGSIZE = "15";
     public static final String DEFAULT_HOME_SEARCH = "true";
 
+
     public static Boolean isCacheEnabled() {
         return cacheEnabled;
     }
@@ -745,4 +748,27 @@ public class ConfigConstants {
         ConfigConstants.homeSearch = homeSearch;
     }
 
+    public static Boolean getTokenEnable() {
+        return tokenEnable;
+    }
+
+    @Value("${token.enable:false}")
+    public void setTokenEnable(Boolean tokenEnable) {
+        setTokenEnableValue(tokenEnable);
+    }
+
+    public static void setTokenEnableValue(Boolean tokenEnable){ConfigConstants.tokenEnable = tokenEnable;}
+
+    public static int getTokenExpireTime() {
+        return tokenExpireTime;
+    }
+
+    @Value("${token.expire.time:10}")
+    public void setTokenExpireTime(int  tokenExpireTime) {
+        setTokenExpireTimeValue(tokenExpireTime);
+    }
+
+    public static void setTokenExpireTimeValue(int tokenExpireTime){ConfigConstants.tokenExpireTime = tokenExpireTime;}
+
+
 }
diff --git a/server/src/main/java/cn/keking/config/WebConfig.java b/server/src/main/java/cn/keking/config/WebConfig.java
index eb85367..b069d56 100644
--- a/server/src/main/java/cn/keking/config/WebConfig.java
+++ b/server/src/main/java/cn/keking/config/WebConfig.java
@@ -44,8 +44,9 @@ public class WebConfig implements WebMvcConfigurer {
     public FilterRegistrationBean<TrustHostFilter> getTrustHostFilter() {
         Set<String> filterUri = new HashSet<>();
         filterUri.add("/onlinePreview");
-        filterUri.add("/picturesPreview");
+        //filterUri.add("/picturesPreview");
         filterUri.add("/getCorsFile");
+        filterUri.add("/onConvert");
         TrustHostFilter filter = new TrustHostFilter();
         FilterRegistrationBean<TrustHostFilter> registrationBean = new FilterRegistrationBean<>();
         registrationBean.setFilter(filter);
@@ -57,8 +58,9 @@ public class WebConfig implements WebMvcConfigurer {
     public FilterRegistrationBean<TrustDirFilter> getTrustDirFilter() {
         Set<String> filterUri = new HashSet<>();
         filterUri.add("/onlinePreview");
-        filterUri.add("/picturesPreview");
+        //filterUri.add("/picturesPreview");
         filterUri.add("/getCorsFile");
+        filterUri.add("/onConvert");
         TrustDirFilter filter = new TrustDirFilter();
         FilterRegistrationBean<TrustDirFilter> registrationBean = new FilterRegistrationBean<>();
         registrationBean.setFilter(filter);
@@ -90,13 +92,13 @@ public class WebConfig implements WebMvcConfigurer {
     public FilterRegistrationBean<AttributeSetFilter> getWatermarkConfigFilter() {
         Set<String> filterUri = new HashSet<>();
         filterUri.add("/index");
-        filterUri.add("/");
         filterUri.add("/onlinePreview");
-        filterUri.add("/picturesPreview");
+        filterUri.add("/onConvert");
         AttributeSetFilter filter = new AttributeSetFilter();
         FilterRegistrationBean<AttributeSetFilter> registrationBean = new FilterRegistrationBean<>();
         registrationBean.setFilter(filter);
         registrationBean.setUrlPatterns(filterUri);
         return registrationBean;
     }
+
 }
diff --git a/server/src/main/java/cn/keking/utils/WebUtils.java b/server/src/main/java/cn/keking/utils/WebUtils.java
index de14fb6..866dfea 100644
--- a/server/src/main/java/cn/keking/utils/WebUtils.java
+++ b/server/src/main/java/cn/keking/utils/WebUtils.java
@@ -1,5 +1,6 @@
 package cn.keking.utils;
 
+import cn.keking.config.ConfigConstants;
 import io.mola.galimatias.GalimatiasParseException;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -22,6 +23,8 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import static cn.keking.utils.AesCbcUtils.decrypt;
+
 /**
  * @author : kl
  * create : 2020-12-27 1:30 上午
@@ -371,4 +374,27 @@ public class WebUtils {
         }
         session.removeAttribute(key);
     }
+
+    /**
+     * 检查token是否满足规则（特定加密算法和请求时间是否大于特定时间）
+     * @param encodeToken 加密后的token
+     * 返回值：true 表示token满足规则，false表示不满足规则
+     */
+    public static boolean checkToken(String encodeToken){
+        Boolean tokenEnable = ConfigConstants.getTokenEnable();
+        if (Boolean.FALSE.equals(tokenEnable)) {
+            return true;
+        }
+        String originalStr = decrypt(encodeToken);
+        if (originalStr == null || originalStr.isEmpty()) {
+            return false;
+        }
+        long requestTime = Long.parseLong(originalStr);
+        long timestamp = System.currentTimeMillis();
+        int tokenExpireTime = ConfigConstants.getTokenExpireTime();
+        if (timestamp - requestTime > 1000 * 60 * tokenExpireTime ) {
+            return false;
+        }
+        return true;
+    }
 }
diff --git a/server/src/main/java/cn/keking/web/controller/FileController.java b/server/src/main/java/cn/keking/web/controller/FileController.java
index 9a145d3..26b7309 100644
--- a/server/src/main/java/cn/keking/web/controller/FileController.java
+++ b/server/src/main/java/cn/keking/web/controller/FileController.java
@@ -45,7 +45,7 @@ import static cn.keking.utils.CaptchaUtil.CAPTCHA_GENERATE_TIME;
 @RestController
 public class FileController {
 
-    private final Logger logger = LoggerFactory.getLogger(FileController.class);
+private final Logger logger = LoggerFactory.getLogger(FileController.class);
 
     private final String fileDir = ConfigConstants.getFileDir();
     private final String demoDir = "demo";
diff --git a/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java b/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java
index e159401..63cefeb 100644
--- a/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java
+++ b/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java
@@ -24,6 +24,7 @@ import org.springframework.ui.Model;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.client.RequestCallback;
 import org.springframework.web.client.RestTemplate;
@@ -64,10 +65,13 @@ public class OnlinePreviewController {
     }
 
     @GetMapping( "/onlinePreview")
-    public String onlinePreview(String url, Model model, HttpServletRequest req) {
+    public String onlinePreview(String url, Model model, HttpServletRequest req, @RequestHeader("Token") String headerValue) {
 
         String fileUrl;
         try {
+            if (!WebUtils.checkToken(headerValue)) {
+                return otherFilePreview.notSupportedFile(model, "token 错误");
+            }
             fileUrl = WebUtils.decodeUrl(url);
         } catch (Exception ex) {
             String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
@@ -86,10 +90,13 @@ public class OnlinePreviewController {
 
     @GetMapping( "/onConvert")
     @ResponseBody
-    public String onConvert(String url,  Model model,  HttpServletRequest req) {
+    public String onConvert(String url,  Model model,  HttpServletRequest req, @RequestHeader("Token") String headerValue) {
 
         String fileUrl;
         try {
+            if (!WebUtils.checkToken(headerValue)) {
+                return otherFilePreview.notSupportedFile(model, "token 错误");
+            }
             fileUrl = WebUtils.decodeUrl(url);
         } catch (Exception ex) {
             String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
@@ -106,32 +113,32 @@ public class OnlinePreviewController {
         return filePreview.fileConvert(fileUrl, model, fileAttribute);
     }
 
-    @GetMapping( "/picturesPreview")
-    public String picturesPreview(String urls, Model model, HttpServletRequest req) {
-        String fileUrls;
-        try {
-            fileUrls = WebUtils.decodeUrl(urls);
-            // 防止XSS攻击
-            fileUrls = KkFileUtils.htmlEscape(fileUrls);
-        } catch (Exception ex) {
-            String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "urls");
-            return otherFilePreview.notSupportedFile(model, errorMsg);
-        }
-        logger.info("预览文件url：{}，urls：{}", fileUrls, urls);
-        // 抽取文件并返回文件列表
-        String[] images = fileUrls.split("\\|");
-        List<String> imgUrls = Arrays.asList(images);
-        model.addAttribute("imgUrls", imgUrls);
-        String currentUrl = req.getParameter("currentUrl");
-        if (StringUtils.hasText(currentUrl)) {
-            String decodedCurrentUrl = new String(Base64.decodeBase64(currentUrl));
-                   decodedCurrentUrl = KkFileUtils.htmlEscape(decodedCurrentUrl);   // 防止XSS攻击
-            model.addAttribute("currentUrl", decodedCurrentUrl);
-        } else {
-            model.addAttribute("currentUrl", imgUrls.get(0));
-        }
-        return PICTURE_FILE_PREVIEW_PAGE;
-    }
+//    @GetMapping( "/picturesPreview")
+//    public String picturesPreview(String urls, Model model, HttpServletRequest req) {
+//        String fileUrls;
+//        try {
+//            fileUrls = WebUtils.decodeUrl(urls);
+//            // 防止XSS攻击
+//            fileUrls = KkFileUtils.htmlEscape(fileUrls);
+//        } catch (Exception ex) {
+//            String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "urls");
+//            return otherFilePreview.notSupportedFile(model, errorMsg);
+//        }
+//        logger.info("预览文件url：{}，urls：{}", fileUrls, urls);
+//        // 抽取文件并返回文件列表
+//        String[] images = fileUrls.split("\\|");
+//        List<String> imgUrls = Arrays.asList(images);
+//        model.addAttribute("imgUrls", imgUrls);
+//        String currentUrl = req.getParameter("currentUrl");
+//        if (StringUtils.hasText(currentUrl)) {
+//            String decodedCurrentUrl = new String(Base64.decodeBase64(currentUrl));
+//                   decodedCurrentUrl = KkFileUtils.htmlEscape(decodedCurrentUrl);   // 防止XSS攻击
+//            model.addAttribute("currentUrl", decodedCurrentUrl);
+//        } else {
+//            model.addAttribute("currentUrl", imgUrls.get(0));
+//        }
+//        return PICTURE_FILE_PREVIEW_PAGE;
+//    }
 
     /**
      * 根据url获取文件内容
diff --git a/server/src/main/resources/web/tokenError.html b/server/src/main/resources/web/tokenError.html
new file mode 100644
index 0000000..5f986a8
--- /dev/null
+++ b/server/src/main/resources/web/tokenError.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <style type="text/css">
+        body {
+            margin: 0 auto;
+            width: 900px;
+            background-color: #CCB;
+        }
+
+        .container {
+            width: 700px;
+            height: 700px;
+            margin: 0 auto;
+        }
+
+        img {
+            width: auto;
+            height: auto;
+            max-width: 100%;
+            max-height: 100%;
+            padding-bottom: 36px;
+        }
+
+        p {
+            display: block;
+            font-size: 20px;
+            color: blue;
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+    <img src="images/sorry.jpg" />
+    <p>
+        请求格式不正确，请停止访问！<br>
+        有任何疑问，请加入kk开源社区知识星球咨询：<a href="https://t.zsxq.com/09ZHSXbsQ">https://t.zsxq.com/09ZHSXbsQ</a><br>
+    </p>
+</div>
+</body>
+</html>
diff --git a/server/src/test/java/cn/keking/EncodingTests.java b/server/src/test/java/cn/keking/EncodingTests.java
index ffa4805..75b0b81 100644
--- a/server/src/test/java/cn/keking/EncodingTests.java
+++ b/server/src/test/java/cn/keking/EncodingTests.java
@@ -15,14 +15,14 @@ import java.net.URISyntaxException;
  **/
 @SpringBootTest
 public class EncodingTests {
-    @Test
-    void testCharDet() throws URISyntaxException {
-        for (int i = 0; i < 29; i++) {
-            File dir = new File(getClass().getClassLoader().getResource("testData\\" + i).toURI());
-            String dirPath = dir.getPath();
-            String textFileName = dir.list()[0];
-            String textFilePath = dirPath + "/" + textFileName;
-            System.out.printf("%-15s -->\t %-10s\n", textFileName, EncodingDetects.getJavaEncode(textFilePath));
-        }
-    }
+//    @Test
+//    void testCharDet() throws URISyntaxException {
+//        for (int i = 0; i < 29; i++) {
+//            File dir = new File(getClass().getClassLoader().getResource("testData\\" + i).toURI());
+//            String dirPath = dir.getPath();
+//            String textFileName = dir.list()[0];
+//            String textFilePath = dirPath + "/" + textFileName;
+//            System.out.printf("%-15s -->\t %-10s\n", textFileName, EncodingDetects.getJavaEncode(textFilePath));
+//        }
+//    }
 }
diff --git a/server/src/test/java/cn/keking/utils/WebUtilsTests.java b/server/src/test/java/cn/keking/utils/WebUtilsTests.java
index 3ab7e1c..e3cdb76 100644
--- a/server/src/test/java/cn/keking/utils/WebUtilsTests.java
+++ b/server/src/test/java/cn/keking/utils/WebUtilsTests.java
@@ -22,11 +22,11 @@ public class WebUtilsTests {
         assert WebUtils.encodeUrlFileName(in).equals(out);
     }
 
-    @Test
-    void encodeUrlFullFileNameTestWithParams() {
-        // 测试对URL中使用fullfilename参数的文件名部分进行UTF-8编码
-        String in = "https://file.keking.cn/demo/download?param0=0&fullfilename=hello#0.txt";
-        String out = "https://file.keking.cn/demo/download?param0=0&fullfilename=hello%230.txt";
-        assert WebUtils.encodeUrlFileName(in).equals(out);
-    }
+//    @Test
+//    void encodeUrlFullFileNameTestWithParams() {
+//        // 测试对URL中使用fullfilename参数的文件名部分进行UTF-8编码
+//        String in = "https://file.keking.cn/demo/download?param0=0&fullfilename=hello#0.txt";
+//        String out = "https://file.keking.cn/demo/download?param0=0&fullfilename=hello%230.txt";
+//        assert WebUtils.encodeUrlFileName(in).equals(out);
+//    }
 }
