From dbc926cbd28eb4e8590d3a4ffca944d1f2a20463 Mon Sep 17 00:00:00 2001 From: zhanghongqing Date: Tue, 14 Feb 2023 09:55:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=9F=E5=90=8D=E7=9B=B8=E5=85=B3=E8=A1=A8?= =?UTF-8?q?=E5=8E=BB=E6=8E=89is=5Faccessible=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mesasoft/cn/sketch/api/ChinaZ.java | 2 -- .../mesasoft/cn/sketch/config/AppConfig.java | 3 -- .../sketch/controller/DomainController.java | 4 +-- .../cn/sketch/entity/domain/DomainBase.java | 3 -- .../cn/sketch/entity/domain/DomainICP.java | 5 +-- .../cn/sketch/entity/domain/DomainWhois.java | 5 --- .../cn/sketch/service/DomainService.java | 2 +- .../service/impl/DomainServiceImpl.java | 31 +++++++++++------- .../com/mesasoft/cn/sketch/util/SktUtil.java | 4 ++- .../cn/sketch/util/ValidationUtils.java | 26 +++++++-------- .../cn/web/controller/UserController.java | 13 ++++++++ .../resources/application-sketch.properties | 7 ++-- src/main/resources/application.properties | 15 +++++---- .../resources/assets/img/background_1.png | Bin 0 -> 44115 bytes src/main/resources/assets/js/admin.js | 1 + src/main/resources/assets/js/default.js | 2 +- src/main/resources/assets/js/index.js | 15 +++++++++ src/main/resources/config.json | 14 ++++---- src/main/resources/mapper/DomainDao.xml | 3 -- src/main/resources/static/index.html | 4 +++ 20 files changed, 90 insertions(+), 69 deletions(-) create mode 100644 src/main/resources/assets/img/background_1.png diff --git a/src/main/java/com/mesasoft/cn/sketch/api/ChinaZ.java b/src/main/java/com/mesasoft/cn/sketch/api/ChinaZ.java index a08c689..218b8f9 100644 --- a/src/main/java/com/mesasoft/cn/sketch/api/ChinaZ.java +++ b/src/main/java/com/mesasoft/cn/sketch/api/ChinaZ.java @@ -14,8 +14,6 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.InputStream; diff --git a/src/main/java/com/mesasoft/cn/sketch/config/AppConfig.java b/src/main/java/com/mesasoft/cn/sketch/config/AppConfig.java index 32947e8..545d743 100644 --- a/src/main/java/com/mesasoft/cn/sketch/config/AppConfig.java +++ b/src/main/java/com/mesasoft/cn/sketch/config/AppConfig.java @@ -1,11 +1,8 @@ package com.mesasoft.cn.sketch.config; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.resource.ResourceUtil; import com.mesasoft.cn.sketch.util.ConfigUtils; import lombok.Data; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/mesasoft/cn/sketch/controller/DomainController.java b/src/main/java/com/mesasoft/cn/sketch/controller/DomainController.java index 875b46d..182f97f 100644 --- a/src/main/java/com/mesasoft/cn/sketch/controller/DomainController.java +++ b/src/main/java/com/mesasoft/cn/sketch/controller/DomainController.java @@ -170,9 +170,9 @@ public class DomainController { * 查询大量数据 */ @GetMapping(value = "/getdomaininfobyfile") - public ReturnT getDomainInfoByFile(HttpServletRequest request, String srcFile, String queryType, SketchAuth sketchAuth) { + public ReturnT getDomainInfoByFile(HttpServletRequest request, String srcFile, String queryType, SketchAuth sketchAuth,Boolean export) { try { - Map domainInfoByFile = domainService.getDomainInfoByFile(SktUtil.getRequestUser(request), srcFile, queryType); + Map domainInfoByFile = domainService.getDomainInfoByFile(SktUtil.getRequestUser(request), srcFile, queryType,export); return ReturnT.succeed(sketchAuth.getRequestid(), domainInfoByFile); } catch (Exception e) { logger.error(e); diff --git a/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainBase.java b/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainBase.java index b16bad0..667a923 100644 --- a/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainBase.java +++ b/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainBase.java @@ -1,10 +1,7 @@ package com.mesasoft.cn.sketch.entity.domain; -import cn.hutool.core.date.DateUtil; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; diff --git a/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainICP.java b/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainICP.java index 5b56c82..f5fe5a0 100644 --- a/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainICP.java +++ b/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainICP.java @@ -1,6 +1,5 @@ package com.mesasoft.cn.sketch.entity.domain; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.mesasoft.cn.sketch.util.ValidationUtils; import lombok.AllArgsConstructor; import lombok.Data; @@ -13,7 +12,6 @@ import lombok.ToString; @ToString public class DomainICP extends DomainBase { - private Boolean is_accessible; private String icp_owner; private String icp_company_name; private String icp_company_type; @@ -23,7 +21,7 @@ public class DomainICP extends DomainBase { private String icp_verify_time; - public DomainICP(String fqdn, String source, Integer match_pattern, Boolean query_success,Boolean is_accessible, String icp_owner, String icp_company_name, + public DomainICP(String fqdn, String source, Integer match_pattern, Boolean query_success, String icp_owner, String icp_company_name, String icp_company_type,String icp_main_page, String icp_site_license, String icp_site_name, String icp_verify_time) { this.fqdn = fqdn; this.source = source; @@ -35,7 +33,6 @@ public class DomainICP extends DomainBase { this.match_pattern = match_pattern; } this.query_success = query_success; - this.is_accessible = is_accessible; this.icp_owner = icp_owner; this.icp_company_name = icp_company_name; diff --git a/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainWhois.java b/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainWhois.java index c31414a..7540d0b 100644 --- a/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainWhois.java +++ b/src/main/java/com/mesasoft/cn/sketch/entity/domain/DomainWhois.java @@ -1,6 +1,5 @@ package com.mesasoft.cn.sketch.entity.domain; -import com.alibaba.fastjson.JSONObject; import com.mesasoft.cn.sketch.util.ConfigUtils; import com.mesasoft.cn.sketch.util.ValidationUtils; import lombok.AllArgsConstructor; @@ -9,11 +8,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; import java.sql.Date; -import java.sql.ResultSet; -import java.sql.SQLException; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.List; /** * Created with IntelliJ IDEA. diff --git a/src/main/java/com/mesasoft/cn/sketch/service/DomainService.java b/src/main/java/com/mesasoft/cn/sketch/service/DomainService.java index bd4f420..bd9195b 100644 --- a/src/main/java/com/mesasoft/cn/sketch/service/DomainService.java +++ b/src/main/java/com/mesasoft/cn/sketch/service/DomainService.java @@ -23,7 +23,7 @@ public interface DomainService { List getICPInfoByFile(MultipartHttpServletRequest request) throws Exception; - Map getDomainInfoByFile(String requestUser, String srcFile, String queryType) throws Exception; + Map getDomainInfoByFile(String requestUser, String srcFile, String queryType,Boolean export) throws Exception; diff --git a/src/main/java/com/mesasoft/cn/sketch/service/impl/DomainServiceImpl.java b/src/main/java/com/mesasoft/cn/sketch/service/impl/DomainServiceImpl.java index 8444571..2388e96 100644 --- a/src/main/java/com/mesasoft/cn/sketch/service/impl/DomainServiceImpl.java +++ b/src/main/java/com/mesasoft/cn/sketch/service/impl/DomainServiceImpl.java @@ -3,6 +3,7 @@ package com.mesasoft.cn.sketch.service.impl; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.log.Log; import com.alibaba.fastjson.JSON; @@ -62,13 +63,14 @@ public class DomainServiceImpl implements DomainService { @Value("${query.readin.batch}") private int queryReadinBatch; - private final boolean isLocal = true; + @Value("${query.isLocal}") + private boolean isLocal; @Override public List getCategoryInfo(List domains, String username) throws Exception { domains = ValidationUtils.getCheckedFqdns(domains); - logger.info("domain category query total : {}", domains.size()); + logger.info("domain category query distinct total : {}", domains.size()); int queryNum = domains.size(); List results = new ArrayList(); //1. 查询本地数据库 @@ -298,22 +300,24 @@ public class DomainServiceImpl implements DomainService { } @Override - public Map getDomainInfoByFile(String requestUser, String srcFile, String queryType) throws Exception { + public Map getDomainInfoByFile(String requestUser, String srcFile, String queryType, Boolean export) throws Exception { //输出文件 String fileName = String.join("-", FileUtil.getPrefix(srcFile), queryType, DateUtil.format(new Date(), "yyyyMMdd-HHmmss") + ".json"); File resultFile = FileUtil.touch(queryOutputDir + File.separator + fileName); - cn.hutool.core.io.file.FileWriter fileWriter = new cn.hutool.core.io.file.FileWriter(resultFile); Map resultMsg = new HashMap<>(); resultMsg.put("result", resultFile.toString()); + resultMsg.put("export", export); // 文件读取 List readUtf8Lines = FileUtil.readUtf8Lines(srcFile); logger.info("[File query]-" + srcFile + " ,queryType " + queryType + " query read in batch " + queryReadinBatch + ",domains size " + readUtf8Lines.size()); List> partition = ListUtil.partition(readUtf8Lines, queryReadinBatch); - int total = 0; + int resultSize = 0; + int querySize = 0; + List queryResults = new ArrayList<>(); + cn.hutool.core.io.file.FileWriter fileWriter = new cn.hutool.core.io.file.FileWriter(resultFile); for (List domains : partition) { - List queryResults = new ArrayList<>(); switch (queryType) { case "category": queryResults = getCategoryInfo(domains, requestUser); @@ -325,17 +329,20 @@ public class DomainServiceImpl implements DomainService { queryResults = getICPInfo(domains); break; } - - if (ObjectUtil.isNotEmpty(queryResults)) { - total += queryResults.size(); + querySize +=domains.size(); + resultSize += queryResults.size(); + if (ObjectUtil.isNotEmpty(queryResults) && export) { List prettyResults = queryResults.stream().map(x -> JSON.toJSONString(x)).collect(Collectors.toList()); //List prettyResults = queryResults.stream().map(x -> JSON.toJSONString(x, true)).collect(Collectors.toList()); fileWriter.appendLines(prettyResults); + logger.info("[File query]-" + srcFile +" result: " + queryResults.size() + " Results saved in " + resultFile.getAbsolutePath()); } - logger.info("[File query]- " + queryType + " query result size " + queryResults.size()); + Double queryTotal = Double.valueOf(readUtf8Lines.size()); + logger.info("[File query]- " + queryType + " query result size: " + resultSize +", query size: " + querySize +", process: "+ NumberUtil.decimalFormat("#.##%", querySize/queryTotal)); + queryResults.clear(); + } - resultMsg.put("total", total); - logger.info("[File query]-" + srcFile + " Results saved in " + resultFile.getAbsolutePath()); + resultMsg.put("total_export", querySize); return resultMsg; } diff --git a/src/main/java/com/mesasoft/cn/sketch/util/SktUtil.java b/src/main/java/com/mesasoft/cn/sketch/util/SktUtil.java index 1547842..95e46d2 100644 --- a/src/main/java/com/mesasoft/cn/sketch/util/SktUtil.java +++ b/src/main/java/com/mesasoft/cn/sketch/util/SktUtil.java @@ -13,11 +13,13 @@ public class SktUtil { * @param request * @return */ + private static String defUsername = "default"; + public static String getRequestUser(HttpServletRequest request) { Object attribute = request.getSession().getAttribute(ValueConsts.USER_STRING); User user = null; if (attribute == null) { - return null; + return defUsername; } else { user = (User) attribute; } diff --git a/src/main/java/com/mesasoft/cn/sketch/util/ValidationUtils.java b/src/main/java/com/mesasoft/cn/sketch/util/ValidationUtils.java index 6893c4a..b001136 100644 --- a/src/main/java/com/mesasoft/cn/sketch/util/ValidationUtils.java +++ b/src/main/java/com/mesasoft/cn/sketch/util/ValidationUtils.java @@ -3,16 +3,10 @@ package com.mesasoft.cn.sketch.util; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.log.Log; -import com.mesasoft.cn.sketch.config.AppConfig; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; import sun.net.util.IPAddressUtil; -import javax.annotation.Resource; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -26,15 +20,17 @@ public class ValidationUtils { private static String tldFilePath; -// @Value("${sketch.tld.file}") -// public void setTldFilePath(String ttlFilePath) { -// this.tldFilePath = ttlFilePath; -// if (StringUtils.isBlank(ttlFilePath) || !FileUtil.exist(ttlFilePath)) { -// this.tldFilePath = ResourceUtil.getResource("public_suffix_list_only.dat").getPath(); -// } -// } + static { - tldFilePath = ResourceUtil.getResource("public_suffix_list_only.dat").getPath(); + try { + tldFilePath = new File("").getCanonicalPath()+"/config/public_suffix_list_only.dat"; + } catch (IOException e) { + logger.error(e); + } + + if(!FileUtil.exist(tldFilePath)){ + tldFilePath = ResourceUtil.getResource("public_suffix_list_only.dat").getPath(); + } } /** * 获取二级域名 diff --git a/src/main/java/com/mesasoft/cn/web/controller/UserController.java b/src/main/java/com/mesasoft/cn/web/controller/UserController.java index ab3f380..6f57aa6 100644 --- a/src/main/java/com/mesasoft/cn/web/controller/UserController.java +++ b/src/main/java/com/mesasoft/cn/web/controller/UserController.java @@ -12,6 +12,7 @@ import com.mesasoft.cn.enums.InterceptorLevel; import com.mesasoft.cn.modules.constant.ConfigConsts; import com.mesasoft.cn.modules.constant.DefaultValues; import com.mesasoft.cn.service.IUserService; +import com.mesasoft.cn.sketch.util.SktUtil; import com.mesasoft.cn.util.ControllerUtils; import com.zhazhapan.modules.constant.ValueConsts; import com.zhazhapan.util.Checker; @@ -278,4 +279,16 @@ public class UserController { } return Result.success(resultObject); } + @ApiOperation(value = "登出") + @ApiImplicitParams({@ApiImplicitParam(name = "username", value = "用户名"), @ApiImplicitParam(name = "token", value = "用于自动登录")}) + @AuthInterceptor(InterceptorLevel.NONE) + @RequestMapping(value = "/logout", method = RequestMethod.PUT) + public String logOut(HttpServletRequest request, String token) { + User user = (User) request.getSession().getAttribute(ValueConsts.USER_STRING); + request.getSession().removeAttribute(ValueConsts.USER_STRING); + TokenConfig.removeTokenByValue(user.getId()); + + jsonObject.put("status", "success"); + return jsonObject.toString(); + } } diff --git a/src/main/resources/application-sketch.properties b/src/main/resources/application-sketch.properties index 7a470a1..df837bf 100644 --- a/src/main/resources/application-sketch.properties +++ b/src/main/resources/application-sketch.properties @@ -1,5 +1,5 @@ #datasource -spring.datasource.url=jdbc:mysql://192.168.44.12:3306/efo?useUnicode=true&characterEncoding=utf-8&useSSL=true +spring.datasource.url=jdbc:mysql://192.168.45.102:3306/web_sketch_v2?useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=galaxy2019 @@ -7,7 +7,7 @@ spring.datasource.password=galaxy2019 query.output.dir = c:\\test\\output_file # offline读取批处理量 -query.readin.batch = 1 +query.readin.batch = 10000 # 打印进度日志的查询条数 query.log.file.line.interval = 10000 @@ -17,6 +17,7 @@ database = web_sketch_v2 db.query.batch.size = 10000 ###################### api ######################### +query.isLocal=true ##### bright cloud ####### bright-cloud.oemid = GeedgeNet bright-cloud.deviceid = TSG-Dev @@ -45,5 +46,5 @@ chinaz.usereport-filepath = chinaz_query_count.csv #顶级域名 sketch.tld.file = public_suffix_list_only.dat -sketch.home.path=C:\\test +sketch.home.path=/home/test/sketch diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1027b16..b494907 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,10 +9,10 @@ spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.druid.filters=stat,wall,slf4j,config spring.datasource.druid.maxActive=100 -spring.datasource.druid.initialSize=1 -spring.datasource.druid.maxWait=60000 -spring.datasource.druid.minIdle=1 -spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 +spring.datasource.druid.initialSize=5 +spring.datasource.druid.maxWait=300000 +spring.datasource.druid.minIdle=5 +spring.datasource.druid.timeBetweenEvictionRunsMillis=300000 spring.datasource.druid.minEvictableIdleTimeMillis=300000 spring.datasource.druid.validationQuery=select 'x' spring.datasource.druid.testWhileIdle=true @@ -23,18 +23,21 @@ spring.datasource.druid.maxOpenPreparedStatements=50 spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.druid.web-stat-filter.enabled=true spring.datasource.druid.stat-view-servlet.enabled=true +spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.druid.stat-view-servlet.login-username=test spring.datasource.druid.stat-view-servlet.login-password=test spring.datasource.druid.stat-view-servlet.allow=127.0.0.1 spring.datasource.druid.stat-view-servlet.deny= +spring.datasource.druid.keep-alive=true +spring.datasource.druid.keep-alive-between-time-millis=3600000 spring.jpa.show-sql=true spring.servlet.multipart.max-file-size=1099511627776 spring.servlet.multipart.max-request-size=1099511627776 #热部署生效 -spring.devtools.restart.enabled=true +spring.devtools.restart.enabled=false #页面热部署 -spring.thymeleaf.cache=false +spring.thymeleaf.cache=true spring.devtools.restart.additional-paths=src/main #classpath目录下的WEB-INF文件夹内容修改不重启 spring.devtools.restart.exclude=WEB-INF/** diff --git a/src/main/resources/assets/img/background_1.png b/src/main/resources/assets/img/background_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5444ab971016a1579c753533e2352d1b30e69f79 GIT binary patch literal 44115 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 AF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/js/admin.js b/src/main/resources/assets/js/admin.js index 695d795..e8286b1 100644 --- a/src/main/resources/assets/js/admin.js +++ b/src/main/resources/assets/js/admin.js @@ -761,4 +761,5 @@ $(document).ready(function () { $(".file-delete").click(function () { doDelete("#file-manager-table", app.files, ".file-index", "/file/batch/"); }); + }); \ No newline at end of file diff --git a/src/main/resources/assets/js/default.js b/src/main/resources/assets/js/default.js index 547cab0..94ecc05 100644 --- a/src/main/resources/assets/js/default.js +++ b/src/main/resources/assets/js/default.js @@ -70,7 +70,7 @@ $(document).ready(function () { } globalConfig.background.imageList = list; } - changeBackgroundImage(); + // changeBackgroundImage(); } setCSS(); }); diff --git a/src/main/resources/assets/js/index.js b/src/main/resources/assets/js/index.js index 772c6ab..78b841b 100644 --- a/src/main/resources/assets/js/index.js +++ b/src/main/resources/assets/js/index.js @@ -622,3 +622,18 @@ function fileDownLoad(path,name) { // 发送ajax请求 xhr.send() } +//退出登录 +function logout() { + layer.load(1); + $.ajax({ + url: "/user/logout", type: "PUT", data: { + token: getCookie("token") + }, success: function (data) { + layer.closeAll(); + var json = JSON.parse(data); + if (json.status === "success") { + window.location.href = "/signin"; + } + } + }); +} \ No newline at end of file diff --git a/src/main/resources/config.json b/src/main/resources/config.json index 542b973..3d48696 100644 --- a/src/main/resources/config.json +++ b/src/main/resources/config.json @@ -50,20 +50,18 @@ } ], "background": { - "useImage": true, + "useImage": false, "imageIndex": 0, "imageList": [ - "https://fakedog.xyz/homedb/srcm/upload/20180123/bg_1.jpg", - "https://fakedog.xyz/homedb/srcm/upload/20180123/bg_2.jpg", - "https://fakedog.xyz/homedb/srcm/upload/20180123/bg_3.jpg" + "assets/img/background_1.png" ], "random": true, "listGenerator": { - "enable": true, - "prefix": "https://fakedog.xyz/image/background/anime/bg_", - "suffix": ".jpg", + "enable": false, + "prefix": "assets/img/background_1", + "suffix": ".png", "start": 1, - "end": 158 + "end": 1 } } }, diff --git a/src/main/resources/mapper/DomainDao.xml b/src/main/resources/mapper/DomainDao.xml index 3eb6a45..e326092 100644 --- a/src/main/resources/mapper/DomainDao.xml +++ b/src/main/resources/mapper/DomainDao.xml @@ -109,7 +109,6 @@ #{listItem} - limit 10 @@ -123,7 +122,6 @@ #{listItem} - limit 10 diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index ae80d73..a643d02 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -61,6 +61,10 @@ --> +