com.dounine.clouddisk360.store.CookieStoreUT Maven / Gradle / Ivy
package com.dounine.clouddisk360.store;
import com.alibaba.fastjson.JSONReader;
import com.alibaba.fastjson.JSONWriter;
import com.dounine.clouddisk360.parser.deserializer.BaseConst;
import com.dounine.clouddisk360.parser.deserializer.login.LoginUserToken;
import org.apache.commons.io.FileUtils;
import org.apache.http.client.CookieStore;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
public class CookieStoreUT {
private static final Logger LOGGER = LoggerFactory.getLogger(CookieStoreUT.class);
private static final String COOKIE_STORE_PATH = File.separator+"cookieStore"+File.separator;
private CookieStore cookieStore;
private LoginUserToken loginUserToken;
public void writeCookieStoreToDisk(CookieStore cookieStore, String[] filterCookies) {
writeCookiesToDisk(cookieStore.getCookies(), filterCookies, true);
}
public void writeCookieStoreToDisk(CookieStore cookieStore, String[] filterCookies, boolean converCookieStore) {
writeCookiesToDisk(cookieStore.getCookies(), filterCookies, converCookieStore);
}
public CookieStore readCookieStoreForDisk() {
return readCookieStoreForDisk(null);
}
public String readCookieValueForDisk(String filter) {
CookieStore cookieStore = readCookieStoreForDisk(new String[] { filter });
List cookies = cookieStore.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals(filter)) {
return cookie.getValue();
}
}
return null;
}
public CookieStore readCookieStoreForDisk(String[] filterCookies) {
if (null != cookieStore)
return cookieStore;
if (null == filterCookies)
filterCookies = new String[0];
List cookies = new ArrayList<>(0);
String path = new StringBuilder(BasePathCommon.BASE_PATH).append(loginUserToken.getAccount()).append(COOKIE_STORE_PATH).append(BaseConst.COOKIES_PATH_NAME).toString();
File cookiesFile = new File(path);
try {
if (!cookiesFile.exists()) {
cookiesFile.getParentFile().mkdirs();
cookiesFile.createNewFile();
LOGGER.info(path + "文件不存在,主动创建一个空文件,并返回新创建的cookieStore");
return new BasicCookieStore();
}
if (FileUtils.readFileToString(cookiesFile).length()<2) {
LOGGER.warn("cookieStore文件内容为空");
return new BasicCookieStore();
}
JSONReader reader = new JSONReader(new FileReader(cookiesFile));
reader.startArray();
while (reader.hasNext()) {
cookies.add(reader.readObject(BasicCookieStore3.class));
}
reader.endArray();
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
List appacheCookies = new ArrayList<>(cookies.size());
BasicClientCookie2 cookie2 = null;
for (BasicCookieStore3 cookieStore3 : cookies) {
cookie2 = new BasicClientCookie2(cookieStore3.getName(), cookieStore3.getValue());
cookie2.setCreationDate(cookieStore3.getCreationDate());
cookie2.setDomain(cookieStore3.getDomain());
cookie2.setExpiryDate(cookieStore3.getExpiryDate());
cookie2.setPath(cookieStore3.getPath());
cookie2.setSecure(cookieStore3.getSecure());
cookie2.setVersion(cookieStore3.getVersion());
appacheCookies.add(cookie2);
}
List filterCookieLists = new ArrayList<>(appacheCookies.size());
for (Cookie cookie : appacheCookies) {
boolean isFilter = false;
if (filterCookies.length == 0) {
isFilter = true;
} else {
for (String cookieName : filterCookies) {
if (cookie.getName().equals(cookieName)) {
isFilter = true;
break;
}
}
}
if (isFilter) {
filterCookieLists.add(cookie);
}
}
cookieStore = new CookieStore() {
@Override
public List getCookies() {
return filterCookieLists;
}
@Override
public boolean clearExpired(Date date) {
return false;
}
@Override
public void clear() {
filterCookieLists.clear();
}
@Override
public void addCookie(Cookie cookie) {
filterCookieLists.add(cookie);
}
};
return cookieStore;
}
private void writeCookiesToDisk(List responseCookies, String[] filterCookies, boolean converCookieStore) {
if (null == filterCookies) {
filterCookies = new String[0];// 手动初始化,防止异常
}
if (null != responseCookies && responseCookies.size() > 0) {
Map repeatCookieTokens = new HashMap<>();// 过滤重复的token
List sortCookieTokens = responseCookies.stream()
.sorted((a, b) -> {
if(null!=a.getExpiryDate()&&null!=b.getExpiryDate()){
return a.getExpiryDate().compareTo(b.getExpiryDate());
}
return 0;
}).collect(Collectors.toList());// 按时间降序
for (Cookie cookie : sortCookieTokens) {// 最大的时间为最新更新的cookie
repeatCookieTokens.put(cookie.getName(), cookie);
}
List removeTokenMoreCookies = new ArrayList<>(repeatCookieTokens.size());
for (Cookie cookie : repeatCookieTokens.values()) {
removeTokenMoreCookies.add(cookie);
}
List writeDiskCookies = new ArrayList<>(0);// 真正写入磁盘的cookies集合
List readDiskCookies = readCookieStoreForDisk().getCookies();// 读取磁盘上的cookies缓存
if (converCookieStore) {
for (Cookie responseCookie : removeTokenMoreCookies) {
if (filterCookies.length == 0) {
writeDiskCookies.add(responseCookie);
} else {
for (String cookieName : filterCookies) {
if (responseCookie.getName().equals(cookieName)) {
writeDiskCookies.add(responseCookie);
break;
}
}
}
}
for (Cookie diskCookie : readDiskCookies) {
if (false == writeDiskCookies.stream().anyMatch(c -> c.getName().equals(diskCookie.getName()))) {// 把不存在的cookie重新添加回去
writeDiskCookies.add(diskCookie);
}
}
} else {
writeDiskCookies = new ArrayList<>(readDiskCookies);
for (Cookie responseCookie : removeTokenMoreCookies) {
if (false == readDiskCookies.stream().anyMatch(c -> c.getName().equals(responseCookie.getName()))) {// 把新的cookie添加进去
if (filterCookies.length == 0) {
writeDiskCookies.add(responseCookie);
} else {
for (String cookieName : filterCookies) {
if (responseCookie.getName().equals(cookieName)) {
writeDiskCookies.add(responseCookie);
break;
}
}
}
}
}
}
File cookiesFile = new File(new StringBuffer(BasePathCommon.BASE_PATH).append(loginUserToken.getAccount()).append(COOKIE_STORE_PATH).append(BaseConst.COOKIES_PATH_NAME).toString());
try {
if (!cookiesFile.exists()) {
cookiesFile.getParentFile().mkdirs();
}
JSONWriter writer = new JSONWriter(new FileWriter(cookiesFile));
writer.startArray();
writeDiskCookies.forEach(writer::writeObject);
writer.endArray();
writer.flush();
writer.close();
cookieStore = new BasicCookieStore();
cookieStore.getCookies().clear();
cookieStore.getCookies().addAll(writeDiskCookies);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void writeCookieStoreToDisk(CookieStore cookieStore, boolean converCookieStore) {
writeCookiesToDisk(cookieStore.getCookies(), null, converCookieStore);
}
public CookieStore getCookieStore() {
return cookieStore;
}
public void setCookieStore(CookieStore cookieStore) {
this.cookieStore = cookieStore;
}
public LoginUserToken getLoginUserToken() {
return loginUserToken;
}
public void setLoginUserToken(LoginUserToken loginUserToken) {
this.loginUserToken = loginUserToken;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy