diff --git a/pom.xml b/pom.xml
index e40748f..a400947 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 3.1.5
+ 3.3.2
com.lion
@@ -62,6 +62,12 @@
test
+
+ org.jsoup
+ jsoup
+ 1.15.3
+
+
cn.hutool
hutool-all
@@ -76,7 +82,7 @@
org.apache.commons
commons-compress
- 1.25.0
+ 1.26.1
@@ -102,7 +108,7 @@
--gc=G1
-H:+ReportExceptionStackTraces
- --initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService
+ --initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService,org.sqlite.util.ProcessRunner
true
diff --git a/src/main/java/com/lion/snss/configuration/MyBatisNativeConfiguration.java b/src/main/java/com/lion/snss/configuration/MyBatisNativeConfiguration.java
index e347fc1..01156bb 100644
--- a/src/main/java/com/lion/snss/configuration/MyBatisNativeConfiguration.java
+++ b/src/main/java/com/lion/snss/configuration/MyBatisNativeConfiguration.java
@@ -38,6 +38,7 @@ import org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
import org.springframework.beans.factory.support.RegisteredBean;
import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -201,8 +202,7 @@ public class MyBatisNativeConfiguration {
} else {
result = (Class>) src;
}
- } else if (src instanceof ParameterizedType) {
- ParameterizedType parameterizedType = (ParameterizedType) src;
+ } else if (src instanceof ParameterizedType parameterizedType) {
int index = (parameterizedType.getRawType() instanceof Class
&& Map.class.isAssignableFrom((Class>) parameterizedType.getRawType())
&& parameterizedType.getActualTypeArguments().length > 1) ? 1 : 0;
@@ -246,8 +246,11 @@ public class MyBatisNativeConfiguration {
Class> mapperInterface = getMapperInterface(beanDefinition);
if (mapperInterface != null) {
// Exposes a generic type information to context for prevent early initializing
- beanDefinition
- .setTargetType(ResolvableType.forClassWithGenerics(beanDefinition.getBeanClass(), mapperInterface));
+ // Exposes a generic type information to context for prevent early initializing
+ ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
+ constructorArgumentValues.addGenericArgumentValue(mapperInterface);
+ beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
+ beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(beanDefinition.getBeanClass(), mapperInterface));
}
}
}
diff --git a/src/main/java/com/lion/snss/dao/ShareFileMapper.java b/src/main/java/com/lion/snss/dao/ShareFileMapper.java
index 30cd4c2..80d1abc 100644
--- a/src/main/java/com/lion/snss/dao/ShareFileMapper.java
+++ b/src/main/java/com/lion/snss/dao/ShareFileMapper.java
@@ -38,6 +38,9 @@ public interface ShareFileMapper {
@Select("select * from share_file where sharer=#{userid}")
ShareFile[] selectAllShareFileByUserid(int userid);
+ @Select("select count(*) from share_file_download_record where share_code=#{shareCode} and ip=#{ip}")
+ int isDownloadBefore(@Param("shareCode") String shareCode, @Param("ip") String ip);
+
@Update("update share_file set expire_time=#{expireTime}, available_count=#{availableCount}, total_count=#{totalCount} " +
"where share_code = #{shareCode}")
void updateShareFile(ShareFile shareFile);
diff --git a/src/main/java/com/lion/snss/service/FileService.java b/src/main/java/com/lion/snss/service/FileService.java
index d7cbd8f..b3ec106 100644
--- a/src/main/java/com/lion/snss/service/FileService.java
+++ b/src/main/java/com/lion/snss/service/FileService.java
@@ -6,6 +6,7 @@ import com.lion.snss.interceptor.Interceptor;
import com.lion.snss.message.DynamicConfigMessage;
import com.lion.snss.pojo.ShareFile;
import com.lion.snss.pojo.User;
+import com.lion.snss.util.CustomUtil;
import com.lion.snss.util.IoUtil;
import com.lion.snss.util.Response;
import jakarta.servlet.http.HttpServletRequest;
@@ -115,13 +116,20 @@ public class FileService {
}
//判断文件是否存在
- if(!new File(shareFile.getFilePath()).isFile()){
+ File file = new File(shareFile.getFilePath());
+ if(!file.isFile()){
try {
httpResponse.sendError(404, "File is not exist");
return;
} catch (IOException e) {throw new RuntimeException(e);}
}
+ //如果该文件被新ip下载,通知进行tg推送
+ if(shareFileMapper.isDownloadBefore(shareCode, ip) == 0){
+ String message = "文件:" + file.getName() + "\n被新ip:" + ip + "下载\n归属地:" + CustomUtil.getLocationByIp(ip);
+ CustomUtil.notifyMe(message);
+ }
+
//ipAndShareCode为下载ip+shareCode,如果包含的话,则说明这个ip不是第一次下载这个文件了
if(ipAndShareCode.containsKey(ip+shareCode)) {
long before = ipAndShareCode.get(ip+shareCode);
diff --git a/src/main/java/com/lion/snss/util/CustomUtil.java b/src/main/java/com/lion/snss/util/CustomUtil.java
index 2605fac..4b5beab 100644
--- a/src/main/java/com/lion/snss/util/CustomUtil.java
+++ b/src/main/java/com/lion/snss/util/CustomUtil.java
@@ -2,10 +2,18 @@ package com.lion.snss.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
+import org.jsoup.Jsoup;
+import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.Charset;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -69,4 +77,34 @@ public class CustomUtil {
return size.get();
}
+
+
+ public static void notifyMe(String message){
+ try (HttpClient httpClient = HttpClient.newHttpClient()) {
+ HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("https://personal.lionwebsite.xyz/message2me?AuthCode=alone&message=" + URLEncoder.encode(message, Charset.defaultCharset()))).POST(HttpRequest.BodyPublishers.noBody()).build();
+ httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
+ } catch (IOException | InterruptedException e) {
+ System.out.println("发送消息:" + message + " 失败");
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static String getLocationByIp(String ip){
+ String location;
+ try (HttpClient httpClient = HttpClient.newHttpClient()){
+ HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("https://www.ip138.com/iplookup.php?ip=" + ip))
+ .headers("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
+ "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8").GET().build();
+ String page = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()).body();
+ Elements tds = Jsoup.parse(page).select("body > div > div.container > div.content > div > div:nth-child(2) > div.group-left > div > div.bd > div.table-outer > div.table-box > table > tbody > tr > td");
+ if(tds.size() > 3)
+ location = tds.get(1).text().replace("中国", "") + " " + tds.get(3).text().trim();
+ else
+ location = tds.get(1).text();
+ }catch (Exception e){
+ System.out.println("获取ip地址信息失败: " + e.getMessage());
+ location = "unknown";
+ }
+ return location;
+ }
}