fix:安全问题修复。新增书签耗时长问题修复

This commit is contained in:
fanxb 2024-06-22 19:30:25 +08:00
parent bb62066b82
commit e0dccb6fd2
6 changed files with 81 additions and 50 deletions

View File

@ -43,6 +43,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
@ -280,11 +281,14 @@ public class BookmarkServiceImpl implements BookmarkService {
bookmark.setUserId(userId);
bookmark.setCreateTime(System.currentTimeMillis());
bookmark.setAddTime(bookmark.getCreateTime());
bookmark.setIcon(getIconPath(bookmark.getUrl(), bookmark.getIcon(), bookmark.getIconUrl()));
bookmark.setIcon(bookmark.getType() == 1 ? "" : getIconPath(bookmark.getUrl(), bookmark.getIcon(), bookmark.getIconUrl(), true));
//文件夹和书签都建立搜索key
pinYinService.changeBookmark(bookmark);
bookmarkDao.insertOne(bookmark);
userApi.versionPlus(userId);
if (StrUtil.isEmpty(bookmark.getIcon()) && bookmark.getType() == 0) {
updateIconAsync(bookmark.getBookmarkId(), bookmark.getUrl(), userId);
}
return bookmark;
}
@ -294,13 +298,33 @@ public class BookmarkServiceImpl implements BookmarkService {
bookmark.setUserId(userId);
if (bookmark.getType() == 0) {
pinYinService.changeBookmark(bookmark);
bookmark.setIcon(getIconPath(bookmark.getUrl(), null, null));
bookmark.setIcon(getIconPath(bookmark.getUrl(), null, null, true));
if (StrUtil.isEmpty(bookmark.getIcon())) {
updateIconAsync(bookmark.getBookmarkId(), bookmark.getUrl(), userId);
}
}
bookmarkDao.editBookmark(bookmark);
userApi.versionPlus(userId);
return bookmark.getIcon();
}
/**
* 异步更新书签icon
*
* @param id 书签id
* @param url 书签url
* @param userId userId
*/
private void updateIconAsync(int id, String url, int userId) {
ThreadPoolUtil.execute(() -> {
String icon = getIconPath(url, null, null, false);
if (StrUtil.isEmpty(icon)) {
return;
}
bookmarkDao.updateIcon(id, icon);
});
}
@Override
@Transactional(rollbackFor = Exception.class)
@ -353,7 +377,7 @@ public class BookmarkServiceImpl implements BookmarkService {
while (!(deal = bookmarkDao.selectUserNoIcon(userId, start, size)).isEmpty()) {
start += size;
deal.forEach(item -> {
String icon = getIconPath(item.getUrl(), null, null);
String icon = getIconPath(item.getUrl(), null, null, false);
if (StrUtil.isNotEmpty(icon)) {
bookmarkDao.updateIcon(item.getBookmarkId(), icon);
}
@ -387,13 +411,14 @@ public class BookmarkServiceImpl implements BookmarkService {
/**
* 获取icon,通过网络获取或者从base64还原
*
* @param url url
* @param icon icon
* @param iconUrl iconUrl
* @param url 书签url路径
* @param icon base64编码的icon
* @param iconUrl base64编码的文件文件名,用于获取文件名后缀
* @param quick 是否快速获取
* @return {@link String}
* @author fanxb
*/
private String getIconPath(String url, String icon, String iconUrl) {
private String getIconPath(String url, String icon, String iconUrl, boolean quick) {
String host;
try {
URL urlObj = new URL(url);
@ -420,7 +445,7 @@ public class BookmarkServiceImpl implements BookmarkService {
return iconPath;
}
//再根据url解析
iconPath = saveFile(host, urlIconAddress + "/icon?url=" + host + "&size=16..128..256");
iconPath = saveFile(host, urlIconAddress + "/icon?url=" + host + "&size=16..128..256", quick);
if (StrUtil.isNotEmpty(iconPath)) {
hostIconDao.insert(host, iconPath);
}
@ -432,11 +457,12 @@ public class BookmarkServiceImpl implements BookmarkService {
*
* @param host host
* @param url url
* @param quick 是否快速获取,快速获取超时时间1s
* @return {@link String}
* @author FleyX
*/
private String saveFile(String host, String url) {
try (Response res = HttpUtil.getClient(false).newCall(new Request.Builder().url(url)
private String saveFile(String host, String url, boolean quick) {
try (Response res = (quick ? HttpUtil.getSHORT_CLIENT() : HttpUtil.getClient(false)).newCall(new Request.Builder().url(url)
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.36")
.get().build()).execute()) {
assert res.body() != null;
@ -450,6 +476,8 @@ public class BookmarkServiceImpl implements BookmarkService {
} else {
log.info("未获取到icon:{}", url);
}
} catch (SocketTimeoutException timeoutException) {
log.info("获取icon超时{}", host);
} catch (Exception e) {
log.error("url获取icon故障:{}", url, e);
}

View File

@ -23,12 +23,6 @@
<artifactId>bookmark-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

View File

@ -74,44 +74,44 @@
<version>8.0.33</version>
</dependency>
<!--邮件依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- &lt;!&ndash;邮件依赖&ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-mail</artifactId>-->
<!-- </dependency>-->
<!--减负依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--json工具依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- &lt;!&ndash;减负依赖&ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.projectlombok</groupId>-->
<!-- <artifactId>lombok</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash;json工具依赖&ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>fastjson</artifactId>-->
<!-- <version>1.2.83</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.elasticsearch.client</groupId>-->
<!-- <artifactId>elasticsearch-rest-high-level-client</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.21</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>cn.hutool</groupId>-->
<!-- <artifactId>hutool-all</artifactId>-->
<!-- <version>5.8.21</version>-->
<!-- </dependency>-->
<!--单元测试-->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<!--mysql jdbc依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>mysql</groupId>-->
<!-- <artifactId>mysql-connector-java</artifactId>-->
<!-- <version>8.0.33</version>-->
<!-- </dependency>-->
<!--邮件依赖-->
<dependency>
@ -140,7 +140,7 @@
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.21</version>
<version>5.8.25</version>
</dependency>
<!--单元测试-->

View File

@ -53,6 +53,14 @@ public class HttpUtil {
.readTimeout(60, TimeUnit.SECONDS)
.build();
/**
* 超时时间1s
*/
@Getter
private static final OkHttpClient SHORT_CLIENT = new OkHttpClient.Builder().connectTimeout(1, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.SECONDS)
.build();
/**
* 获取客户端
*

View File

@ -22,7 +22,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<version>2.7.17</version>
<relativePath/>
</parent>

View File

@ -24,3 +24,4 @@ pnpm-debug.log*
*.njsproj
*.sln
*.sw?