From da9ab506136e3ac12b5566e05aace2e72f80d0df Mon Sep 17 00:00:00 2001 From: chuzhongzai Date: Tue, 20 Aug 2024 17:03:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=87=E4=BB=B6=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E7=9B=91=E6=8E=A7=EF=BC=8C=E5=BD=93=E6=9C=89=E6=96=B0?= =?UTF-8?q?ip=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E6=97=B6=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++++-- .../MyBatisNativeConfiguration.java | 11 ++++-- .../com/lion/snss/dao/ShareFileMapper.java | 3 ++ .../com/lion/snss/service/FileService.java | 10 ++++- .../java/com/lion/snss/util/CustomUtil.java | 38 +++++++++++++++++++ 5 files changed, 66 insertions(+), 8 deletions(-) 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; + } }